【问题标题】:C2535 with template-class in unordered_map (Microsoft Visual Studio 2015 CTP6)在 unordered_map 中具有模板类的 C2535 (Microsoft Visual Studio 2015 CTP6)
【发布时间】:2015-07-04 01:12:43
【问题描述】:

我在尝试编译以下代码时遇到一个奇怪的 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
}

请注意,如果我使用自己的基于模板的哈希器

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 的错误还是这种行为在某种程度上符合标准?

【问题讨论】:

  • std::hash 不是一个类。是结构。看直播rextester.com/VHHQE6270
  • @user2451677:据我所知,struct 只是一个默认访问是公共而不是私有的类。不管怎样,一个基于模板的 struct Hash 被完美编译了!
  • @user2451677 好点。我以为它被宣布为class hash
  • @user2451677:现在我明白你的意思了 :)
  • @Mischa,您是部分专业化模板。因此,它必须与主模板完全“相同”。 struct Hash 之所以有效,是因为它是新模板(主模板),而不是专业化

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


【解决方案1】:

实际上,这是由于 §14.5.1/4 中的一个微妙之处而变得不正确:

重新声明、部分特化、显式特化或 类模板的显式实例化,class-key 应同意 与原始类模板声明实物一致 (7.1.6.3)。

并且,根据 §20.9/2,hash 被声明为

标题&lt;functional&gt;概要

// 20.9.12, hash function primary template:
template <class T> struct hash;

因此尝试

template <int NUMBER>
struct hash<Container<NUMBER>> { /*…*/ };

改为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多