我在尝试编译以下代码时遇到奇怪的C2535编译错误:
template<int NUMBER>
class Container {
public:
bool operator==(const Container& other) const { return true; }
};
namespace std {
template <int NUMBER>
class hash<Container<NUMBER>> {
public:
size_t operator()(const Container<NUMBER> & state) const {
return 0;
}
};
}
int main(int argc, char* argv[]){
auto* b = new std::unordered_map< Container<1>, int>(); //C2535
}
请注意,如果我使用自己的基于模板的Hasher
template<int NUMBER>
class Hash {
public:
size_t operator()(const Container<NUMBER> & state) const {
return 0;
}
};
int main(int argc, char* argv[]){
auto* b = new std::unordered_map< Container<1>, int, Hash<1>>();
}
代码编译得很好。我记得代码是在Visual Studio 2013 Express中顺利编译的。
问题:这是一个VS 2015 - 错误还是这种行为在某种程度上符合标准?
答案 0 :(得分:3)
实际上,§14.5.1/ 4中的细微之处使其变得格格不入:
在重新声明,部分专业化,显式专业化或 显式实例化类模板, class-key 应该同意 与原始类模板声明一起使用(7.1.6.3)。
并且,根据§20.9/ 2,hash
被声明为
标题
<functional>
简介// 20.9.12, hash function primary template: template <class T> struct hash;
因此尝试
template <int NUMBER>
struct hash<Container<NUMBER>> { /*…*/ };
代替。