Добрый всем день!
Столкнулся с такой нехорошей вещью.
У меня есть класс:
template<class T>
class TypeClass
{
public:
};
template<>
class TypeClass<int>
{
public:
typedef Int Type;
};
И шаблонная функция
template<class T>
void my_fun(T& var)
{
typedef TypeClass<T>::Type Type;
Type* t = new Type;
}
VC говорит — все окей!
А вот g++ ругается на строчку
typedef TypeClass<T>::Type Type;
щас не могу привести пример что точно пишет. Чуть позже выложу. Но чтобы все работало приходится писать так:
typedef class TypeClass<T>::Type Type;
Ктото сталкивался с таким? Или подскажите где найти сайт разработчиков g++, чтобы им задать вопрос?
typedef typename TypeClass<T>::Type Type;
А вот ещё более интересная запись:
class A
{
public:
typedef std::vector<int> my_vec_t;
};
typedef typename my_vec_t::template iterator my_iterator_t;
Ну и это как бы всё правильно
Это С++ стандарт.
Здравствуйте, Seon, Вы писали:
S>Ктото сталкивался с таким? Или подскажите где найти сайт разработчиков g++, чтобы им задать вопрос?
Они правы, так по стандарту. MSVC грешит вольностью.
TypeClass<T>::Type
Совершенно не ясно, что такое Type, так как это член шаблона. У него может быть специализация по некому T, где Type будет переменной, а может его и вообще не быть.
Поэтому, чтобы указать компилятору, что это имя типа, надо писать:
typename TypeClass<T>::Type
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, Seon, Вы писали:
S>>Ктото сталкивался с таким? Или подскажите где найти сайт разработчиков g++, чтобы им задать вопрос?
VE>Они правы, так по стандарту. MSVC грешит вольностью.
VE>VE>TypeClass<T>::Type
VE>
VE>Совершенно не ясно, что такое Type, так как это член шаблона. У него может быть специализация по некому T, где Type будет переменной, а может его и вообще не быть.
VE>Поэтому, чтобы указать компилятору, что это имя типа, надо писать:
VE>VE>typename TypeClass<T>::Type
VE>
Спасибо, все понял!