【发布时间】:2015-07-07 13:11:17
【问题描述】:
我有以下课程:
class DictionaryRef {
public:
operator bool() const;
std::string const& operator[](std::string const& name) const;
// ...
};
然后我尝试使用它:
DictionaryRef ref = ...;
ref["asdf"]; // error
输出抱怨两个重载,但只列出一个:
1>...: error C2666: 'DictionaryRef::operator []' : 2 overloads have similar conversions
1> ...: could be 'const std::string &DictionaryRef::operator [](const std::string &) const'
1> while trying to match the argument list '(DictionaryRef, const char *)'
但是,将鼠标悬停在带下划线的部分上,弹出窗口告诉我第二个选项是built-in operator integer[pointer-to-object]。显然它考虑将对象转换为 bool,然后使用神秘的运算符 int[char const*]。我以前从未听说过这个运算符,但显然3["asdf"] 与"asdf"[3] 相同?是否有人曾经使用过这种语法,或者它是来自 C 的一些真正古老的残余?此外,是否需要两次转换才能到达那里-首先从DictionaryRef到bool,然后从bool到int?
【问题讨论】:
-
代码编译了吗?
-
我在
DictionaryRef类中没有看到采用istring的方法;您能否发布所有相关代码以便我们更好地帮助您? -
@RedRoboHood: [] 运算符实际上采用 istring (这是一个 typedef'd string_base 具有不区分大小写的特征),我只是忘记在错误消息中将其编辑出来,但如果我使用常规字符串。代码已完成,我可以将其粘贴到一个新项目中并得到相同的错误。
-
不,我在该类中没有任何其他运算符。正如我所说,如果我将该类声明(字面意思是,没有额外的成员代替 //...)复制到一个新项目中,我仍然会遇到同样的错误。
-
将
operator bool()标记为explicit也应该可以解决您的问题(在 C++11 中)。
标签: c++ visual-studio visual-studio-2013