我有以下内容:
#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。
答案 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);
}
undefined reference to `std::hash<int const>::operator()(int) const'
目前我无法解释这一点。
答案 3 :(得分:1)
只要您#include <string>
,Visual Studio 2010就会按原样编译源代码,以便它可以对string
进行比较测试。
正如其他海报所提到的那样,你 也应该使你的密钥成为常规string
而不是const string
,因为这符合STL标准,但这是并不是必须使VS 2010编译上面的源代码。