讓我們來看看代碼:多重繼承
template <typename C>
class S {
public:
void add (C c) { ++cnt; }
size_t size() const { return cnt; }
private:
size_t cnt {};
};
struct Foo1 {};
struct Foo2 {};
struct Foo3 {};
class Z : public S<Foo1>, public S<Foo2>, public S<Foo3> {
public:
using S<Foo1>::add;
using S<Foo2>::add;
using S<Foo3>::add;
using S<Foo1>::size; // (1)
using S<Foo2>::size; // (2)
using S<Foo3>::size; // (3)
};
和使用情況是這樣的:
Z z;
z.add (Foo1 {});
z.add (Foo1 {});
z.add (Foo2 {});
cout << z.size() << endl;
此代碼編譯罰款gcc-5.1(C++ 11),但是這個代碼不能在clang-3.5下編譯(C++ 11 - 對不起,我沒有clang的新版本)。
鐺產生「錯誤:調用成員函數‘尺寸’不明確」這基本上是(從我的觀點來看)是正確的,但GCC編譯它,並返回。
好,但這裏更有趣,如果我切換行的順序標註評論(1)和(2),得到的東西是這樣的:
using S<Foo2>::size; // (2)
using S<Foo1>::size; // (1)
的代碼仍然編譯海合會其結果是:。你可以想象,如果你在這兩行之前寫行(3),你將得到。
所以,從我所看到的,GCC被首先使用的小號<Ç> ::大小聲明,忽略它們的休息和使用這一個。
有人能告訴我哪個編譯器根據C++標準做了正確的工作嗎?
報道在https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66698
最佳, 阿圖爾
[Wandbox鏈接](http://melpon.org/wandbox/permlink/EMKWrvy558kzZmQD)。看起來像是4.6.4中的錯誤。 –
顯然,你的代碼是不明確的,不應該編譯。 clang報告的錯誤是正確的。 MSVC也報告無效的歧義。你應該報告錯誤。 – Christophe