以前に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は、この問題String
をint
引き起こすことから、への暗黙の変換があるかもしれないと示唆しました。これを書き留めている間、私はそれが反対でなければならないという結論に達します–から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]
コメントを追加