Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Декабрь 04, 2015, 14:11



Название: Видимость в template
Отправлено: Igors от Декабрь 04, 2015, 14:11
Добрый день

Код
C++ (Qt)
struct Base {
void Method1( void ) {}
};
 
template <class T>
struct Derived : public T {
 
void Method2( void )
{
Method1();   // ошибка (undefined Method1 и.т.п.)
}
};
 
Причем одни компиляторы пропускают, др нет. Понятно что если я "инстанциирую" Derived классом у которого нет Mеthod1, то по-любому ошибка (и это правильно). Но тут до инстанциации дело не доходит, просто не компилит текст выше. Есть ли отвечающая за это опция?

Спасибо


Название: Re: Видимость в template
Отправлено: vregess от Декабрь 04, 2015, 16:09
Попробуй

Код
C++ (Qt)
T::Method1();
 


Название: Re: Видимость в template
Отправлено: Igors от Декабрь 04, 2015, 16:41
Попробуй

Код
C++ (Qt)
T::Method1();
 
И что, так дрочиться для каждого метода по всему тексту? А если будут виртуалы, то вообще завал. Если уж латать, то лучше using - но вопрос был не о том


Название: Re: Видимость в template
Отправлено: Racheengel от Декабрь 05, 2015, 01:30
А почему Derived должен видеть Method1?
Ведь он от Base не наследован.


Название: Re: Видимость в template
Отправлено: vregess от Декабрь 05, 2015, 08:19
Причем одни компиляторы пропускают, др нет.

Скорее всего такие компиляторы (которые пропускают) просто не обращают внимание на шаблон, который не используется, т.е. проверяют синтаксис и все, а что там дальше откладывают до момента появления в коде. Так, на пример, поступит MSVC, но gcc кинет ошибку.

Есть ли отвечающая за это опция?

Вряд ли есть такая опция.


Название: Re: Видимость в template
Отправлено: alex312 от Декабрь 05, 2015, 11:15
надо вызывать унаследованные методы через this.
Код
C++ (Qt)
template <class T>
struct Derived : public T {
 
void Method2( void )
{
this->Method1();   // ошибка (undefined Method1 и.т.п.)
}
};
 


Название: Re: Видимость в template
Отправлено: Igors от Декабрь 05, 2015, 14:57
надо вызывать унаследованные методы через this.
Это тоже "как латать", напр я получил эту проблему в open-sources, мне надо их менять, а для след версии - опять

.. т.е. проверяют синтаксис и все, а что там дальше откладывают до момента появления в коде.
Эту фразу слышал/читал много раз, но что в данном случае есть "проверка синтаксиса"? Выходит он понимает что Method1 - что-то глобальное, а описания нет, вот и ошибка. А если using или this, то это метод темплейт-класса и его надо оставить в покое до момента инстанциации. Вроде "логично" но почему не однообразно и где это  регламентируется? 


Название: Re: Видимость в template
Отправлено: m_ax от Декабрь 05, 2015, 20:57
Цитировать
Это тоже "как латать", напр я получил эту проблему в open-sources, мне надо их менять, а для след версии - опять
Сталкивался я как то с такой проблемой, не соврать, ZThread была та библиотека.. Тож пришлось руками править.. Но ничего) Потом всё заработало)


Название: Re: Видимость в template
Отправлено: Racheengel от Декабрь 06, 2015, 00:04
Вообще странно, что у вас компилятор не игнорирует темплейты, которые не были инстанциированы...
Студия,например, просто пропускает такие шаблоны.


Название: Re: Видимость в template
Отправлено: Igors от Декабрь 06, 2015, 10:40
Вообще странно, что у вас компилятор не игнорирует темплейты, которые не были инстанциированы...
Студия,например, просто пропускает такие шаблоны.
Как??? Ведь студия "самый строгий компилятор"!! :) Правда icc тоже пропускает, но вот шланг и gcc нет


Название: Re: Видимость в template
Отправлено: Racheengel от Декабрь 06, 2015, 11:49
Кто сказал, что студия строгая? :)
msvc компилит только инстанциированые классы.
Но в принципе это правильно, какой смысл компилить неинстанциированный темплейт?


Название: Re: Видимость в template
Отправлено: _Bers от Декабрь 30, 2015, 01:18
Вроде "логично" но почему не однообразно и где это  регламентируется? 

в стандарте.

он разрешает оставить этот вопрос на усмотрение компиляторов.
но при этом рекомендует два возможных подхода к реализации:

"two-phase name lookup"
и однофазный.

gcc июзает двухфазный,
студия - однофазный.

при двухфазке компилятор строит АСД на основе имеющихся у него данных.
и имеет полное право забить болт на какое то непонятное Т,
которое до момента инстанцирования ему все равно никак не известно.
но АСД он уже сможет построить.
и стандарт ему это разрешает.

а при однофазке АСД строится в момент инстанцирования,
когда все типы итак уже известны.

мораль простая: шаблоны + наследование = this->member.

бесит, что тайпдефы тоже не наследуются:
привет, копипаста.



Название: Re: Видимость в template
Отправлено: _Bers от Декабрь 30, 2015, 01:19
Кто сказал, что студия строгая? :)
msvc компилит только инстанциированые классы.
Но в принципе это правильно, какой смысл компилить неинстанциированный темплейт?

оптимизация.


гцц значительно более быстро билдит тяжелые шаблоны.