gpt4 book ai didi

c++ - 专门化命名空间中的模板——命名空间别名真的是别名吗?

转载 作者:太空狗 更新时间:2023-10-29 23:05:31 24 4
gpt4 key购买 nike

我正在尝试提供 hash<>我一直在研究的一系列类型的特化。到目前为止一切顺利,特化本身很容易提供,我已经为 numeric_limits<> 做过类似的事情.但我面临的问题是如何以可移植到 C++11 和 -pre-11(C++03 或其他)的方式提供特化。

当然,我遇到的问题是 hash<>可以在多个命名空间之一中定义,我不得不在同一命名空间中提供特化。

// in c++11
namespace std { struct hash<>...; }
// in c++03 this is one possibility
namespace std { namespace tr1 { struct hash<>...; } }

// my library's specialization
namespace ????_open {
struct hash<mytype>...;
????_close

当然,一种选择是使用#defines 来访问、打开和关闭足够的命名空间,或者提供具有 N 个不同特化的 N 个文件并有条件地 #include 正确的文件,但这很麻烦:

#if defined(some_c++11_condition)
#include "c++11-specialization.h"
#elif defined(some_c++03_condition)
#include "c++03-specialization.h"
#elif (some_other_condition)
#oh_dear_who_knows_what_this_include_will_be_like
#else_ad_nauseam
#endif

当然,如果我被迫我会坚持这个策略,但我之前想探索一些其他的选择。特别是,我虽然可以使用 namespace alias 专注于正确的地方:

#if defined(some_c++11_condition)
namespace std_specialize = std;
#elif defined(some_c++03_condition)
namespace std_specialize = std::tr1;
#...
#endif

...

namespace std_specialize {
struct hash<mytype>...;
}

不幸的是,这在我尝试过的 3 个编译器(MSVC 2008、GCC 4.7、Clang 3.0)中的任何一个都不起作用,在重新打开命名空间的行中出现了关于“declaration of namespace conflicts with...”的各种错误,这不应该发生因为命名空间可以多次重新打开,如果别名是别名而不是其他别名,那么这也应该适用于它们。

那么,命名空间别名真的是别名,还是有其他含义的用词不当?还是有其他原因导致我无法以这种方式进行特化?如果是这样,是否还有其他方法(比 #defines 的弹幕更好)?

最佳答案

是的,namespace 别名确实是别名。发生错误是因为您将 std_specialize 声明为 stdstd::tr1 的别名,然后尝试声明一个 namespace 同名。如果它是合法的,在该声明之后,std_specialize 指的是什么,std(或 std::tr1)或包含您的新命名空间hash 特化?

你可能想要做的是

namespace std {
#if __cplusplus < 201103L
namespace tr1 {
#endif

template<>
struct hash<my_type> { ... };

#if __cplusplus < 201103L
}
#endif
}

关于c++ - 专门化命名空间中的模板——命名空间别名真的是别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19037113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com