以下程序无法在VS 2013 SP3上编译。问题是什么?如何避免这种情况?
#include <string>
class Test
{
public:
operator int() const
{
return 42;
}
inline Test *operator[](const std::string &name)
{
return this;
}
};
int main(int argc, char* argv[])
{
Test ts;
Test *k = ts["huhu"];
return 0;
}
输出是: C2666:数字重载具有类似的转换
答案 0 :(得分:4)
编译器是正确的。这段代码有两种解释:
用户定义的运算符[]和字符串转换
ts.operator[](std::string("huhu"))
内置运算符[]和int转换
*(int(ts) + "huhu")
这两个都需要一个用户定义的转换,所以它们都是&#34;好&#34;。
要修复它,按照Yochai的说法,给它一个operator[]
重载,只需要一个标准的数组到指针转换:
inline Test *operator[](const char* name)
{
return operator[](std::string(name));
}