logo search
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.9.9 Имена локальных типов

Имена типов подчиняются точно таким же правилам областей видимости,

как и другие имена. В частности, имена типов, определенные в описании

класса, нельзя использовать вне этого класса без уточнения, например:

class X {

public:

typedef int I;

class Y { /* ... */ }

I a;

};

I b; // ошибка

Y c; // ошибка

X::Y d; // ошибка

Следующее положение ограничивает зависимость от контекста правил

описания членов класса, а так же правила переноса тела функций,

являющихся подстановками. После использования в описании класса

имя константы, имя-класса или имя-typedef не может переопределяться в

описании этого класса. Имя, не являющееся именем-класса или именем-typedef

не может быть определено в описании класса как имя-класса или имя-typedef,

если оно уже использовалось иначе в описании этого класса.

Рассмотрим пример:

typedef int c;

enum { i = 1 };

class X {

char v[i];

int f() { return sizeof(c); }

char c; // ошибка: имя typedef

// переопределяется после использования

enum { i = 2 }; // ошибка: `i' переопределяется после

// использования в задании типа `char[i]'

};

typedef char* T;

struct Y {

T a;

typedef long T; // ошибка: имя T уже использовано

T b;

};