Здравствуйте, McSeem2, Вы писали:
MS>Делаем так:
MS>MS>template<class T> base_class
MS>{
MS>public:
MS> int base_var;
MS>};
MS>template<class T> derived_class : public base_class<T>
MS>{
MS>public:
MS> int f()
MS> {
MS> return base_var;
MS> }
MS>};
MS>
MS>И он не видит base_var. Видит только this->base_var
MS>или (что лучше) base_class<T>::base_var.
MS>Первый вопрос — почему так?
По стандарту. И не только gcc, но и VC++ 7.1 делает то же самое с опцией /Za.
Этот вопрос, по-моему, уже обсуждался в форуме. Можно глянуть Вандервуда и Джоссатиса C++ templates -- там это точно было.
Если коротко -- проблема в том, когда именно производить разрешение имен. В точке определения или в точке "воплощения" шаблона. В точке определения компилятор не может знать ничего о шаблонном базовом классе -- из-за специализации. Имя base_var не является dependent name в данном случае, поэтому разрешается(с ошибкой) в точке определения шаблона.
this -> base_var
base_class<T>::base_var -- dependent name (грубо говоря, имеет "существенную" зависимость от параметров шаблона).
MS>Второй вопрос — если так, то почему резолвится this->base_var? Ведь this это не base_class<T>, это — тот же самый derived_class<T>?
this -> derived_class<T>::base_var -- вот так может быть более ясно
Можно ещё using использовать.
... << RSDN@Home 1.1.0 stable >>