Local type names follow the same scope rules as other names. Type names defined within a class declaration have class scope and cannot be used outside their class without qualification.
If you use a class name, typedef name, or a constant name that is used in a type name, in a class declaration, you cannot redefine that name after it is used in the class declaration.
For example:
void main () { typedef double db; struct st { db x; typedef int db; // error db y; }; }
The following declarations are valid:
typedef float T; class s { typedef int T; void f(const T); };
Here, function f() takes an argument of type s::T. However,
the following declarations, where the order of the members of s
has been reversed, cause an error:
typedef float T; class s { void f(const T); typedef int T; };
In a class declaration, you cannot redefine a name that is not a class name, or a typedef name to a class name or typedef name once you have used that name in the class declaration.