C ++ unordered_map导致编译时错误

时间:2012-01-16 20:00:35

标签: c++ unordered-map

我有以下内容:

#include<iostream>
#include<unordered_map>
#include<tuple>

using namespace std;

class CTest {
    // Properties
    public:
        unordered_map<const string, tuple<int, int> > Layout;
    // Methods
    public:
        CTest ();
        ~CTest ();
};

CTest::CTest () {
    Layout["XYZ"] = make_tuple (0, 1);
}

CTest::~CTest () {
  // Do nothing
}

int main (int argc, char *argv[]) {
    CTest Test;
    return 0;
}

编译这个简单的程序会出现以下错误:

  

错误C2678:二进制'==':找不到运算符,它接受类型为'const std :: string'的左手操作数(或者没有可接受的转换)

我在Windows 7中使用Visual Studio 2010 Professional。

4 个答案:

答案 0 :(得分:3)

除了将Layout更改为:

之外
unordered_map<string, tuple<int, int> > Layout;

如Johan和Benjamin所述,您还需要#include <string>

注意,即使Layout是多余的,我也不明白为什么需要对const进行更改。

答案 1 :(得分:2)

您需要删除键上的const限定符。

unordered_map<const string, tuple<int, int> > Layout;

unordered_map<string, tuple<int, int> > Layout;

这是因为根据这个答案,键总是const:

Using a const key for unordered_map

我认为根本原因与Duplicate const qualifier allowed in C but not in C++?

有关

此外,正如其他帖子指出的那样你可能需要包含字符串(尽管gcc似乎带有iostream)

答案 2 :(得分:1)

正如所指出的,您最初错误的原因是您需要包含<string>。但是,您可能还有另一个问题:

unordered_map<const string, tuple<int, int> > Layout;

您(可能)需要从该字符串中删除const:

unordered_map<string, tuple<int, int> > Layout;

这可能不是您的编译器所必需的,但它在我的编译器上。首先,const是多余的,map / unordered_map键无论如何都是const,但这不是问题。问题与散列函数模板有关,不适用于const类型。

以下简单程序为我隔离了问题:

#include <functional>
int main (int argc, char *argv[])
{
    std::hash<const int> h;
    h(10);
}

http://ideone.com/k2vSy

undefined reference to `std::hash<int const>::operator()(int) const'

目前我无法解释这一点。

答案 3 :(得分:1)

只要您#include <string>,Visual Studio 2010就会按原样编译源代码,以便它可以对string进行比较测试。

正如其他海报所提到的那样,你 也应该使你的密钥成为常规string而不是const string,因为这符合STL标准,但这是并不是必须使VS 2010编译上面的源代码。