サンプルコードは次のとおりです。
struct A
{
virtual int operator & ( A & ) { return 0; }
};
struct B : public A {};
struct C : public A {};
struct D : public C, public B {};
int main()
{
D d;
std::cout << &d << std::endl;
return 0;
}
VS 2008 では完全に動作しますが、GCC ではコンパイルに失敗します。
../src/TestCast.cpp: In function ‘int main()’:
../src/TestCast.cpp:26:16: error: request for member ‘operator&’ is ambiguous
../src/TestCast.cpp:15:14: error: candidates are: virtual int A::operator&(A&)
../src/TestCast.cpp:15:14: error: virtual int A::operator&(A&)
make: *** [src/TestCast.o] Error 1
私が見る限り、署名ではなく名前で operator& overload を検索するため、あいまいなオーバーロードを見つけてエラーを生成します。
問題は、標準で正しいかどうかです。そうでない場合、それを説明している段落はどれですか? GCCにこのコードを受け入れさせる方法はありますか(つまり、名前ではなく署名で検索します)。
ところで、私はこのコードを修正する方法を知っています。エラーが表示される理由を知りたいだけです。