C++ std::映射运算符[],具有用户定义的键

C++ std::映射运算符[],具有用户定义的键,c++,templates,stdmap,C++,Templates,Stdmap,我正在尝试将std::map的[]运算符与自定义密钥类型一起使用: typedef tuple<DWORD, DWORD, DWORD, DWORD> Version; // Key type const map<Version, string> codenames { { {3,0,1,5}, "Maserati" }, { {3,0,2,6}, "Elephant" } }; Version ver{3,0,2,6}; string codenam

我正在尝试将
std::map
[]
运算符与自定义密钥类型一起使用:

typedef tuple<DWORD, DWORD, DWORD, DWORD> Version; // Key type

const map<Version, string> codenames {
    { {3,0,1,5}, "Maserati" },
    { {3,0,2,6}, "Elephant" }
};

Version ver{3,0,2,6};
string codename = codenames[ver];
// Error C2678 binary '[': no operator found which takes a left-hand operand of type '...' (or there is no acceptable conversion)

string codename = codenames[{3,0,2,6}];
// Same error
typedef元组版本;//键类型
常量映射代码名{
{{3,0,1,5},“玛莎拉蒂”},
{{3,0,2,6},“大象”}
};
版本{3,0,2,6};
字符串codename=codenames[ver];
//错误C2678二进制“[”:未找到接受类型为“…”的左侧操作数的运算符(或没有可接受的转换)
字符串代码名=代码名[{3,0,2,6}];
//同样的错误
是否可以使用带有该自定义密钥类型的
[]
运算符访问值?我正在使用Visual Studio 2015 Update 3

附言:


问题:不是重复的,因为它与
[]
操作符无关,也没有回答这个问题。

我不确定它是否与编译器相关。您的程序可以在VC++中编译。您确定您的问题报告是准确的吗?您的映射定义无效(因为std::tuple构造函数是显式的)。实际的问题是,我简化了我的代码,以便在问题中显示它,但我忘了在映射中添加一个
const
修饰符。当
codenames
映射是
const
时,编译失败,出现了我之前提到的错误。我不确定原因。此外,我不知道是否应该发布一个解释这一点的答案。@karliwson运算符[]不适用于常量映射,请改用
.at()
。正如@Revolver\u Ocelot指出的那样。您的所有症状都是由于您的遗漏造成的。我不确定它是否与编译器相关。您的程序可以在VC++中编译。您确定您的问题报告准确吗?您的映射定义无效(因为std::tuple构造函数是显式的)。实际的问题是,我简化了我的代码,以便在问题中显示它,但我忘了在映射中添加一个
const
修饰符。当
codenames
映射是
const
时,编译失败,出现了我之前提到的错误。我不确定原因。此外,我不知道是否应该发布一个解释这一点的答案。@karliwson运算符[]不适用于常量映射,请使用
.at()
代替。正如@Revolver\u Ocelot指出的那样。您的遗漏是您所有症状的原因。