$ 7.3.3/14(C++ 03)重載分辨率/歧義名稱查找(其中之一)
struct A { int x(); };
struct B : A { };
struct C : A {
using A::x;
int x(int);
};
struct D : B, C {
using C::x;
int x(double);
};
int f(D* d) {
return d->x(); // ambiguous: B::x or C::x
}
在 'F' 的代碼的註釋表示一個可以預期B之間」歧義:: x'或'C :: x'。
然而,與克編譯++(ideone)或科莫錯誤略有不同。這些錯誤,而不是表明B :: X歧義或C :: X表明一個事實,即A是d區的含糊的基礎
prog.cpp: In function ‘int f(D*)’: prog.cpp:16: error: ‘A’ is an ambiguous base of ‘D’
而且
"ComeauTest.c", line 21: error: base class "A" is ambiguous return d->x(); // ambiguous: B::x or C::x
在$ 10.2,打算到名字查找規則,我感覺到代碼片段中的評論並不真正正確。這個錯誤的確首先涉及基類「A」的模糊性,而不是其他任何內容(例如重載分辨率的模糊性)。有什麼想法嗎?
有趣的是,視覺C++編譯10.0以上,選擇在B A子對象...我可以理解它,如果它在C.選擇的子對象看來,g ++以及科莫第一解決成員函數爲A :: x(),然後他們發現d-> A :: x()是不明確的。但是,有趣的是,Visual C++ 10.0甚至可以編譯! – 2010-11-09 03:39:47
@Alf P. Steinbach:是的。我也很驚訝 – Chubsdad 2010-11-09 03:49:26
因爲我沒有C++ 03編譯器,所以我希望這個問題能夠被容忍...在結構D中使用virtual關鍵字如何:virtual B,C或struct D:虛擬C,虛擬B? – JimR 2010-11-09 07:47:41