Officially, what is typename for?

c++, templates

Solution

Following is the quote from Josutti's book:

The keyword `typename` was introduced to specify that the identifier that follows is a type. Consider the following example:

template <class T>
Class MyClass
{
  typename T::SubType * ptr;
  ...
};

Here, `typename` is used to clarify that `SubType` is a type of `class T`. Thus, `ptr` is a pointer to the type `T::SubType`. Without `typename`, `SubType` would be considered a static member. Thus

T::SubType * ptr

would be a multiplication of value `SubType` of type `T` with `ptr`.

Problem

On occasion I've seen some really indecipherable error messages spit out by `gcc` when using templates... Specifically, I've had problems where seemingly correct declarations were causing very strange compile errors that magically went away by prefixing the `typename` keyword to the beginning of the declaration... (For example, just last week, I was declaring two iterators as members of another templated class and I had to do this)... What's the story on `typename`?

Original source

Related problems