2011-08-11 65 views
19

我在C++標準中讀到的關於注入類名的內容與我將很快提出的示例程序的行爲相矛盾(正如我所見)。這是我讀:模糊注入類名不是錯誤

  • 從3.4(第3款)

    一類的注射類名(第9條),也被認爲是 該類的成員名稱隱藏和查找的目的。

  • 從9(第2段)

    一個類名稱被插入到在其中聲明 的類名被看作後立即範圍。類名也是 插入到類本身的範圍內;這被稱爲 注入類的名稱。爲了進行訪問檢查, 注入類名稱被視爲是公共成員名稱。

從這些我理解,下面是一個結構良好的翻譯單元,它編譯成功。

#include <vector> 
class X: std::vector<int> 
{ 
    vector mem; 
}; 

不過,我會假設以下應該產生一個錯誤,但由於該名vector被注入到雙方std::vector<int>std::vector<char>因爲它不

#include <vector> 
class X: std::vector<int>, std::vector<char> 
{ 
    vector mem; //compiles OK... mem is apparently std::vector<int> 
}; 

彷彿一個公共成員名稱,那麼它應該被X繼承,因此名稱vectorX應該是不明確的。我錯過了什麼嗎?

P.S.我正在使用MSVC9.0

+1

+1。好問題 – Nawaz

+0

第二個子句在你的例子中沒有提到'X'?即是*注入類名*而不是'X'而不是'vector'?我認爲是這種情況,如果是這樣的話,引號與代碼無關,但是編譯器的行爲似乎仍然不正確,要麼沒有理由優先於'std :: vector '來覆蓋'std ::矢量',這意味着應該有一個模糊性錯誤被觸發。 –

+1

@David:在'X'類中是的,但'vector'作爲公共名稱被注入到兩個基地中......所以它應該在'X'裏面可見(也是模棱兩可的) - 就像第一個例子 –

回答

15

我找到了!這就是標準!我是對的!它應該曖昧!

第14.6.1段

該發現可導致在某些情況下一個 歧義注入類名(10.2)(A查找例如,如果在多於一個 發現基類)。如果找到的所有注入類名稱都指向同一類模板的專業化,並且名稱 後跟模板參數列表,則引用指的是類模板本身,而不是專業化而不是 含糊不清。[實施例:

template <class T> struct Base { }; 
template <class T> struct Derived: Base<int>, Base<char> 
{ 
    typename Derived::Base b; // error: ambiguous typename 
    Derived::Base<double> d; // OK 
}; 

末端示例]

底線:這是又一Microsoft編譯BUG。禁用語言擴展也無濟於事。

4

不,你不會錯過任何東西,而你的編譯器似乎表現出錯誤。你可以看到GCC如何處理在這裏它:http://ideone.com/MI9gz

它的錯誤消息是:

prog.cpp:4:4: error: reference to 'vector' is ambiguous 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error: candidates are: class std::vector<char> std::vector<char>::vector 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error:     class std::vector<int> std::vector<int>::vector 
+0

啊,的確,真的!我剛剛從標準中找到了自己的引用(請參閱我的答案) –