Загадочный typename

Вот, обновили компилер на сервере(GCC) с 3.2 до 4.0.1. Компилить он стал быстрее но некоторые старые исходники перестали на нем компилится вообще. Танцы с бубном помогли понять причину этого и устранить. Оказывается, более старые версии были лояльными к использованию typename и они могли без помощи программиста определить что используемый идентификатор это имя типа, а не что-нибудь другое. Новая версия этого делать не умеет(ну или не хочет).

Фрагмент кода, который успешно компилился на 3.2:

template <class T> class threadVector : public vector <T> {
….
vector<T>::iterator current;
}

компилятор спокойно себе понимал что vector<T>::iterator это имя типа. Теперь же указанную строчку надо заменить на

typename vector<T>::iterator current;

явно указав, что этот идентификатор является именем типа. Кстати, в третьем издании Страуструпа об этом пишут только в приложении, не слова не упоминая в основной части книги.

Кстати, решение проблемы подсказал сам компилятор, отдельный респект его разработчикам.



Digital Ocean
Провайдер облачного хостинга - заведи свой виртуальный сервер всего за $5 в месяц !

Leave a Reply