Pergunta

Dependent types generally need typename to tell the compiler the member is a type, not a function or variable.

However, this is not always the case.
For example, a base class doesn't require this, because it can only ever be a type:

template<class T> struct identity { typedef T type; }
template<class T> class Vector : identity<vector<T> >::type { };  // no typename

Now my question is, why does typedef ever require typename after it?

template<class T> class Vector
{
    typedef typename /* <-- why do we need this? */ vector<T>::iterator iterator;
};
Foi útil?

Solução

typedef does not need to appear before the type.

template <typename T>
struct S { typedef T type; };
template <typename T>
void f() { typename S<T>::type typedef t; }

This is perfectly valid, and in this case, I hope you can understand that parsing would be complicated if typename were optional.

I can understand that

template <typename T>
void f() { typedef S<T>::type t; }

could be interpreted differently, but that would introduce unexpected cases where the position of the typedef keyword suddenly becomes significant.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top