ローカル型名は、他の名前と同じスコープ規則に従います。
クラス宣言の中で定義される型名にはクラス・スコープがあり、
修飾をしなければ、それらのクラスの外側で使用することはできません。
型名で使用されているクラス名、typedef 名、または定数名をクラス宣言で使用すると、 その名前をクラス宣言で再定義することはできません。
次に例を示します。
int main () { typedef double db; struct st { db x; typedef int db; // error db y; }; }
次の宣言は有効です。
typedef float T; class s { typedef int T; void f(const T); };
ここで、関数 f() は型 s::T の引き数を 取ります。しかし、s のメンバーの順序が逆になっている以下の宣言は、 エラーとなります。
typedef float T; class s { void f(const T); typedef int T; };
クラス宣言で一度その名前を使用したクラス名または typedef 名に 対して、クラス名または typedef 名でない名前をクラス宣言で 再定義することはできません。
関連参照