エラー:オーバーロードされた演算子 '[]'の使用があいまいです

pcdev

以前にAndroidNDKバージョンr8e(GCC)でコンパイルされた古い継承コードでこのエラーが発生します。Android NDKバージョンr16(Clang)を使用してコンパイルするようにアップグレードしようとしています。私は何年も前に大学からC ++を使用していませんが、プログラミングは初めてではありません。

メソッドのシグネチャはヘッダーと一致しているように見えますが、あいまいさを引き起こす可能性のある他の演算子のシグネチャは見当たりません。パラメータが明らかにint。であるのに、なぜあいまいなのかわかりませんこのエラーの原因は何ですか?

演算子の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);
    // ...
};

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);
    // ...
};

2つの演算子があります。1つ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引き起こすことから、への暗黙の変換があるかもしれないと示唆しました。これを書き留めている間、私はそれが反対でなければならないという結論に達します–からintへの暗黙の変換がありStringます。よくわからないので、私はそれを呼んだだけですString::fromInt(int)(しかしそれはまたString::String(int)何か他のものかもしれません)。

あいまいさを解決するために、私は最初に明示的なconstキャストを提案しました。

((const XmlNode&)xml)[idx]

しかし、これはまだ十分ではありませんでした。(場合、私はわからないんだけど、これが使用されている特定のコンパイラの弱さである。)おそらく、コンパイラはまだからの暗黙的なキャストを適用const XmlNode&するXmlDoc&ので、まだ同じ曖昧さを認識しています。(それは単なる推測です。)したがって、私の新しい提案:

((const XmlDoc&)xml[idx]

これは進歩を引き起こしました。(あいまいさは2番目に移動しましたoperator[]。)

したがって、この問題の完全な解決策は次のとおりです。

((const XmlNode&)((const XmlDoc&)xml)[idx])[0]

質問者は成功を報告しました。


この動作が(どの)C ++標準に準拠しているかどうかがわからないことを認めなければなりません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

エラー:オーバーロードされた演算子「*」の使用があいまいです

分類Dev

オーバーロードされた演算子の使用があいまい

分類Dev

オーバーロードされた演算子()C ++を使用するとエラーが発生します

分類Dev

オーバーロードされた演算子 '<<'の使用があいまいです(オペランドタイプ 'ostream'(別名 'basic_ostream <char>')および 'Person')

分類Dev

オーバーロードされた演算子が認識されません。エラー2

分類Dev

オーバーロードされた演算子が未定義

分類Dev

std :: listのオーバーロードされたブラケット演算子

分類Dev

msvc / Permissive- std :: stringオーバーロードされた演算子 '='があいまいです

分類Dev

オーバーロードされた演算子 '[]'の使用は、テンプレートキャスト演算子ではあいまいです

分類Dev

オーバーロードされた演算子のパラメーターが多すぎます、Visual Studio C ++

分類Dev

C ++クラスのオーバーロードされた演算子が呼び出されない

分類Dev

オーバーロードされた代入演算子を使用するとエラーが発生するのに、コンパイラが提供する演算子を使用できないのはなぜですか?

分類Dev

std :: functionパラメーターを使用したオーバーロードされた演算子

分類Dev

ソートで使用されていないペアのオーバーロードされた演算子<

分類Dev

内部と外部のオーバーロードされたC ++演算子の違い

分類Dev

演算子のオーバーロードエラー?

分類Dev

エラーを与える演算子のオーバーロード

分類Dev

エラーC ++演算子のオーバーロード

分類Dev

C ++演算子「>>」のオーバーロードエラー

分類Dev

オーバーロード演算子のエラー>>

分類Dev

オーバーロードされた加算演算子の使用の難しさ

分類Dev

オーバーロードされた演算子 "<<" c ++の予期しない動作

分類Dev

クラス宣言でオーバーロードされた演算子を使用できますか?

分類Dev

これをオーバーロードされた<<演算子に渡します

分類Dev

エラー:オーバーロードされた 'abs(double)'の呼び出しがあいまいです

分類Dev

オーバーロードされたI / O演算子内でインクリメント演算子をオーバーロード中にエラーが発生しました

分類Dev

ネストされたノードクラス演算子のオーバーロード<c ++

分類Dev

オーバーライドされた<<演算子が認識されません

分類Dev

オーバーロードされた静的演算子の使用方法

Related 関連記事

  1. 1

    エラー:オーバーロードされた演算子「*」の使用があいまいです

  2. 2

    オーバーロードされた演算子の使用があいまい

  3. 3

    オーバーロードされた演算子()C ++を使用するとエラーが発生します

  4. 4

    オーバーロードされた演算子 '<<'の使用があいまいです(オペランドタイプ 'ostream'(別名 'basic_ostream <char>')および 'Person')

  5. 5

    オーバーロードされた演算子が認識されません。エラー2

  6. 6

    オーバーロードされた演算子が未定義

  7. 7

    std :: listのオーバーロードされたブラケット演算子

  8. 8

    msvc / Permissive- std :: stringオーバーロードされた演算子 '='があいまいです

  9. 9

    オーバーロードされた演算子 '[]'の使用は、テンプレートキャスト演算子ではあいまいです

  10. 10

    オーバーロードされた演算子のパラメーターが多すぎます、Visual Studio C ++

  11. 11

    C ++クラスのオーバーロードされた演算子が呼び出されない

  12. 12

    オーバーロードされた代入演算子を使用するとエラーが発生するのに、コンパイラが提供する演算子を使用できないのはなぜですか?

  13. 13

    std :: functionパラメーターを使用したオーバーロードされた演算子

  14. 14

    ソートで使用されていないペアのオーバーロードされた演算子<

  15. 15

    内部と外部のオーバーロードされたC ++演算子の違い

  16. 16

    演算子のオーバーロードエラー?

  17. 17

    エラーを与える演算子のオーバーロード

  18. 18

    エラーC ++演算子のオーバーロード

  19. 19

    C ++演算子「>>」のオーバーロードエラー

  20. 20

    オーバーロード演算子のエラー>>

  21. 21

    オーバーロードされた加算演算子の使用の難しさ

  22. 22

    オーバーロードされた演算子 "<<" c ++の予期しない動作

  23. 23

    クラス宣言でオーバーロードされた演算子を使用できますか?

  24. 24

    これをオーバーロードされた<<演算子に渡します

  25. 25

    エラー:オーバーロードされた 'abs(double)'の呼び出しがあいまいです

  26. 26

    オーバーロードされたI / O演算子内でインクリメント演算子をオーバーロード中にエラーが発生しました

  27. 27

    ネストされたノードクラス演算子のオーバーロード<c ++

  28. 28

    オーバーライドされた<<演算子が認識されません

  29. 29

    オーバーロードされた静的演算子の使用方法

ホットタグ

アーカイブ