Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ typename and inner classes

Tags:

c++

templates

I tried googling this, but I was unable to come up with a suitable answer. Could any C++ gurus tell me why C++ requires you to declare OuterClass<T>::Innerclass with the typename keyword?

I am a TA for a data structures course and I see this error all of the time. I know to tell my students that they need to put typename in front of the return type, but I am unable to explain why this is required.

Thanks.

like image 881
John C Earls Avatar asked Oct 14 '10 15:10

John C Earls


2 Answers

That's because of the two-phase name lookup in templates. When the compiler sees Innerclass it must know whether that name is a type or not (is could, for example, be a static member of type int for some specialization of OuterClass). So it supposes it is NOT a type name unless you say so. typename must be used in templates and only on names dependent on the template parameter. HTH

example:

template <class T>
class X
{ 
   typedef T XXX;
};
template<>
class X<char>
{
   static int XXX;
};

template<class T>
class Y
{        
   // X<T>::XXX member; invalid XXX is not assumed to be a type! 
   typename X<T>::XXX member; 
   //we explicitly specify that XXX is a type; Later, upon instantiation, we will verify that
};
like image 65
Armen Tsirunyan Avatar answered Oct 03 '22 17:10

Armen Tsirunyan


OuterClass<T>::Innerclass

That because Innerclass represents a type (as I can see from your question) so you need to add the keyword typename before OuterClass<T>::Innerclass

Example :

template <class T>
void foo() {
   T::iterator * iter;
   ...
}

Without typename T::iterator * iter; would be interpreted as multiplication operation between T::iterator and iter

like image 21
Prasoon Saurav Avatar answered Oct 03 '22 15:10

Prasoon Saurav