Проблема typedef у g++
От: Seon  
Дата: 04.10.08 07:52
Оценка:
Добрый всем день!

Столкнулся с такой нехорошей вещью.
У меня есть класс:

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++, чтобы им задать вопрос?
Re: Проблема typedef у g++
От: nen777w  
Дата: 04.10.08 08:13
Оценка:
  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;


Ну и это как бы всё правильно Это С++ стандарт.
Re: Проблема typedef у g++
От: VoidEx  
Дата: 04.10.08 08:14
Оценка: 1 (1) +1
Здравствуйте, Seon, Вы писали:

S>Ктото сталкивался с таким? Или подскажите где найти сайт разработчиков g++, чтобы им задать вопрос?


Они правы, так по стандарту. MSVC грешит вольностью.

TypeClass<T>::Type


Совершенно не ясно, что такое Type, так как это член шаблона. У него может быть специализация по некому T, где Type будет переменной, а может его и вообще не быть.
Поэтому, чтобы указать компилятору, что это имя типа, надо писать:

typename TypeClass<T>::Type
Re[2]: Проблема typedef у g++
От: Seon  
Дата: 04.10.08 10:25
Оценка:
Здравствуйте, 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>


Спасибо, все понял!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.