2013-04-05 62 views
2

在這種情況下,爲什麼我無法訪問B1案例中不合格的基類成員x?不loook曖昧我...從模板繼承時需要合格的訪問權限

template<class T> 
struct A { T x; }; 

template<class T> 
struct B1 : A<T> { T f() { return A<T>::x; } }; 

struct B2 : A<int> { int f() { return x; } }; 
+0

不知道在使用 – pascal 2013-04-05 11:57:12

回答

3

因爲x不依賴,它會在模板中定義的 上下文中擡起頭來。在這種情況下, 編譯器不知道T,並且無法查看依賴的基類 類。例如,它如何知道A<T>的任何內容,而不知道T是什麼。 (可能有A的專門化,例如完全不同的成員。)

+0

之前使用A :: x'這不能解釋*爲什麼編譯器無法看到x '。基類不是'T',它是'A ',當'B1'被定義時'A '的定義已經可用。我知道這種語言並不是那種方式,但是我所讀到的這個問題是「爲什麼不呢?」 – hvd 2013-04-05 11:57:35

+0

實際上,我認爲這裏的問題更多的是爲什麼它不能看到'x',因爲我們知道*基類型是'A '。根本沒有模板參數。 – 2013-04-05 11:58:40

+0

基類依賴於'T'。編譯器在知道「T」是什麼之前不能看到它。 (如果'A '明確專用於某些類型,例如? – 2013-04-05 12:04:33