错误:使用重载运算符'[]'是不明确的

时间:2017-12-06 05:17:24

标签: android c++ android-ndk operator-overloading clang

我使用以前在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);
             ^

1 个答案:

答案 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建议可能存在从Stringint的隐式转换,从而导致此问题。在写这篇文章的时候,我得出的结论却恰恰相反 - 有一种从intString的隐式转换。在不知情的情况下,我只是称之为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 ++标准。