Russian Qt Forum
Май 21, 2024, 16:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Видимость в template  (Прочитано 8177 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 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, то по-любому ошибка (и это правильно). Но тут до инстанциации дело не доходит, просто не компилит текст выше. Есть ли отвечающая за это опция?

Спасибо
Записан
vregess
Гость
« Ответ #1 : Декабрь 04, 2015, 16:09 »

Попробуй

Код
C++ (Qt)
T::Method1();
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 04, 2015, 16:41 »

Попробуй

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Декабрь 05, 2015, 01:30 »

А почему Derived должен видеть Method1?
Ведь он от Base не наследован.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
vregess
Гость
« Ответ #4 : Декабрь 05, 2015, 08:19 »

Причем одни компиляторы пропускают, др нет.

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

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

Вряд ли есть такая опция.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #5 : Декабрь 05, 2015, 11:15 »

надо вызывать унаследованные методы через this.
Код
C++ (Qt)
template <class T>
struct Derived : public T {
 
void Method2( void )
{
this->Method1();   // ошибка (undefined Method1 и.т.п.)
}
};
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 05, 2015, 14:57 »

надо вызывать унаследованные методы через this.
Это тоже "как латать", напр я получил эту проблему в open-sources, мне надо их менять, а для след версии - опять

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

Сообщений: 2094



Просмотр профиля
« Ответ #7 : Декабрь 05, 2015, 20:57 »

Цитировать
Это тоже "как латать", напр я получил эту проблему в open-sources, мне надо их менять, а для след версии - опять
Сталкивался я как то с такой проблемой, не соврать, ZThread была та библиотека.. Тож пришлось руками править.. Но ничего) Потом всё заработало)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Декабрь 06, 2015, 00:04 »

Вообще странно, что у вас компилятор не игнорирует темплейты, которые не были инстанциированы...
Студия,например, просто пропускает такие шаблоны.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 06, 2015, 10:40 »

Вообще странно, что у вас компилятор не игнорирует темплейты, которые не были инстанциированы...
Студия,например, просто пропускает такие шаблоны.
Как??? Ведь студия "самый строгий компилятор"!! Улыбающийся Правда icc тоже пропускает, но вот шланг и gcc нет
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Декабрь 06, 2015, 11:49 »

Кто сказал, что студия строгая? Улыбающийся
msvc компилит только инстанциированые классы.
Но в принципе это правильно, какой смысл компилить неинстанциированный темплейт?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #11 : Декабрь 30, 2015, 01:18 »

Вроде "логично" но почему не однообразно и где это  регламентируется? 

в стандарте.

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

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

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

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

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

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

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

Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #12 : Декабрь 30, 2015, 01:19 »

Кто сказал, что студия строгая? Улыбающийся
msvc компилит только инстанциированые классы.
Но в принципе это правильно, какой смысл компилить неинстанциированный темплейт?

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


гцц значительно более быстро билдит тяжелые шаблоны.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.116 секунд. Запросов: 22.