Typename is a
C++ keyword. It can appear in two places:
- In the formal parameter list of a template.
template <typename T> class foo { ... };
There it is indistinguishable from the keyword class. Certain non-standard-comforming compilers distinguish between the two words to forbid class parameters being specialized with builtin types.
This use of typename should be avoided if at all possible.
- In a class-scope typedef declaration, to give the compiler a hint as to whether an as-yet undeclared identifier is a type:
typedef typename foo foo_alias;
This use is somewhat more meaningful. If you have a template taking a class as a parameter, and you want to use typedef-names declared in the parameter class, you need to specity typename in order for your code to compile:
struct Foo
{
typedef unsigned short size_type;
};
struct Bar
{
typedef unsigned long size_type;
};
template <class T>
struct Baz
{
// typedef T::size_type size_type; // error - undeclared identifier
typedef typename T::size_type size_type; // OK
static const size_type size_size = sizeof (size_type);
};
typedef Baz<Foo> foo_baz;
typedef Baz<Bar> bar_baz;
//
// foo_baz::size_type is "unsigned short"
// bar_baz::size_type is "unsigned long"
//