我在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繼承,因此名稱vector
在X
應該是不明確的。我錯過了什麼嗎?
P.S.我正在使用MSVC9.0
+1。好問題 – Nawaz
第二個子句在你的例子中沒有提到'X'?即是*注入類名*而不是'X'而不是'vector'?我認爲是這種情況,如果是這樣的話,引號與代碼無關,但是編譯器的行爲似乎仍然不正確,要麼沒有理由優先於'std :: vector'來覆蓋'std ::矢量',這意味着應該有一個模糊性錯誤被觸發。 –
@David:在'X'類中是的,但'vector'作爲公共名稱被注入到兩個基地中......所以它應該在'X'裏面可見(也是模棱兩可的) - 就像第一個例子 –