下面是示例代碼:Ambigulty同時調用重載操作
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
據我看到的,它看起來對於運營商&按名稱重載,而不是通過簽名,因此它找到模糊的過載併產生錯誤。
問題是:Standard是否正確?如果沒有,哪一段描述呢?有什麼辦法讓GCC接受這個代碼(我的意思是,通過簽名而不是名字查找)。
順便說一句,我知道,如何解決這個代碼。我只想知道,爲什麼會出現錯誤。
GCC是正確的。名稱查找發生在超載結束之前,並且它必須是明確的。由於D包含兩個A型子對象,它也有兩個'operator',一個在B中,另一個在C. – jrok
令人驚訝的是,Clang 3.4(當前中繼)在C++ 11模式下接受這個代碼:http:// coliru.stacked-crooked.com/view?id=1315da921103f7ba233cc24f9ed0cd2c-76b69eb4e48bf39ce4212f2d8ff4a507 – rubenvb
不幸的是,對於G ++,它不起作用...... :( –