Compiler Error C2899

typename cannot be used outside a template declaration

The typename keyword can only be used in a template definition or declaration. In a template declaration, it can be used in two ways. See the example below:

// one way to use typename
template<typename T> class X {};

// another way to use typename
template<class T> struct X {
   typename T::A a;   // T::A is a type
};

If typename is used outside a template declaration, this error will be generated. For example:

struct Y {
   typedef int B;
   typename Y::B b;   //illegal
};