簡體   English   中英

錯誤:使用重載運算符'[]'是不明確的

[英]Error: use of overloaded operator '[]' is ambiguous

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

從這里開始:

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 ++標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM