Re: GCC 3.4 новые правила разрешения имен
От: Шахтер Интернет  
Дата: 17.06.04 04:42
Оценка: 12 (1)
Здравствуйте, 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 >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.