带有unordered_map模板类的C2535(Microsoft Visual Studio 2015 CTP6)

时间:2015-04-25 11:02:47

标签: c++ hash unordered-map visual-studio-2015

我在尝试编译以下代码时遇到奇怪的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 - 错误还是这种行为在某种程度上符合标准?

1 个答案:

答案 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>> { /*…*/ };

代替。