我使用以前在Android NDK版本r8e(GCC)下编译的旧的继承代码收到此错误。我正在尝试使用Android NDK版本r16(Clang)升级到编译。我很多年前就没有使用C ++,但我不是编程新手。
方法签名看起来与标题一致,我看不到任何其他可能导致歧义的操作员签名。当参数显然是int
时,我不确定为什么它不明确。这个错误的原因是什么?
注释掉其中一个运营商可以解决问题,但需要两个运营商。
部首:
class XmlNode
{
public:
// ... - let me know if you think I might have snipped anything important
XmlNode &operator[](int idx) const;
XmlNode &operator[](const String &name);
// ...
};
class XmlDoc : public XmlNode
{
public:
// snipped ... no further overrides here
};
类别:
// ...
XmlNode &operator[](int idx) const
{
return *list[idx];
}
XmlNode &operator[](const String &name)
{
// ...
if(found)
{
// ...
return *list[IndexOf(head)];
}
// not found - create new entry
return Add(name); // add the whole path
}
上下文代码:
// ...
int idx = xml.IndexOf("METHOD");
// ...
MyClient::setSaveTrace(xml[idx][0].GetTextAsInt("SaveTrace", TRUE));
错误:
C:/.../myclass.cpp:3392:41: error: use of overloaded operator '[]' is ambiguous (with operand types 'KIT::XmlDoc' and 'int')
MyClient::setSaveTrace(xml[idx][0].GetTextAsInt("SaveTrace", TRUE));
~~~^~~~
C:/.../KIT-Xml.h:94:14: note: candidate function
XmlNode &operator[](int idx) const;
^
C:/.../KIT-Xml.h:95:11: note: candidate function
XmlNode &operator[](const String &name);
^
答案 0 :(得分:1)
从这里开始:
class XmlNode
{
public:
// ... - let me know if you think I might have snipped anything important
XmlNode &operator[](int idx) const;
XmlNode &operator[](const String &name);
// ...
};
有两个运算符:一个const
,另一个非const
。
有关:
XmlDoc xml;
int idx;
xml[idx];
这是不明确的,因为编译器显然无法决定应用哪个隐式转换。
或者:
((const XmlDoc&)xml).operator[](idx) // for the first
或:
xml.operator[](String::fromInt(idx)) // for the second
注:
Paul McKenzy建议可能存在从String
到int
的隐式转换,从而导致此问题。在写这篇文章的时候,我得出的结论却恰恰相反 - 有一种从int
到String
的隐式转换。在不知情的情况下,我只是称之为String::fromInt(int)
(但也可能是String::String(int)
或其他任何内容。)
为了解决歧义,我首先提出了明确的const
- cast:
((const XmlNode&)xml)[idx]
但这还不够。 (我不确定这个是否是使用的特定编译器的弱点。)可能,编译器仍然应用从const XmlNode&
到XmlDoc&
的隐式转换,因此认识到仍然存在同样的歧义。 (这只是猜测。)因此,我的新建议:
((const XmlDoc&)xml[idx]
这引起了进步。 (模糊性转移到第二个operator[]
。)
因此,该问题的完整解决方案:
((const XmlNode&)((const XmlDoc&)xml)[idx])[0]
提问者报告成功。
我不得不承认我无法判断这种行为是否符合(哪个)C ++标准。