2013-04-05 7 views
2

В такой ситуации, почему я не могу получить доступ к члену базового класса x, не имеющему квалификации в случае B1? Не 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

не знал о 'использовании A :: x' перед – pascal

ответ

3

Поскольку x не зависит, она будет искаться в контексте, где определен шаблон. В этом контексте компилятор ничего не знает о T и не может искать в зависимой базе классов. Как это может, например, знать что-либо из A<T>, не зная, что такое T. (Может быть специализация A, например, с совершенно разными членами.)

+0

Это не объясняет * почему * компилятор не может видеть' x '. Базовый класс не является 'T', это' A ', и определение' A 'уже доступно, когда определено' B1'. Я знаю, что язык не работает таким образом, но вопрос, как я его прочитал, «почему он не делает этого?» – hvd

+0

На самом деле, я думаю, здесь возникает вопрос о том, почему он не может видеть 'x', если мы знаем *, базовый тип - это' A '. Здесь нет шаблонных аргументов. –

+0

Базовый класс зависит от 'T'. Компилятор не может его увидеть, пока не узнает, что такое 'T'. (Что, если 'A ' явно специализирован для некоторых типов, например?) –

Смежные вопросы