Использование имени typedef в разработанном спецификаторе - PullRequest
4 голосов
/ 30 ноября 2011

Согласно ($ 3.4.4) имя typedef, за которым следует ключ класса, недопустимо. Но я не уверен, в какой сфере? Например: далее компилятор не будет жаловаться, если в блоке, например внутри функции, используется разработанный спецификатор.

typedef class { /* ... */ } S;

// invalid
class S;

// ok
void foo() {
   class S;
}

Допустимо ли объявлять класс в локальной области видимости с помощью typedef-name, почему?

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

7.1.3 параграф 3 сообщает:

В данной области видимости спецификатор typedef не должен использоваться для переопределения имени любого типа, объявленного в thascope, для ссылки на другой тип.[Пример:

class complex { /* ... */ }; 
typedef int complex; //

ошибка: переопределение

Затем идет:

- конец примера] Аналогично, вданная область, класс или перечисление не должны объявляться с тем же именем, что и имя typedef, которое объявлено в этой области и ссылается на тип, отличный от самого класса или перечисления.[Пример:

typedef int complex;
class complex { /* ... */ };

// ошибка: переопределение

Это ваш пример.

2 голосов
/ 30 ноября 2011

Проблема в том, что вы объявили класс без имени, но с псевдонимом (typedef).Позже вы использовали то же имя для объявления без определения другого класса (я знаю, что это не было намерением, но именно это понимал компилятор), и его имя конфликтовало с typedef.Когда вы делали то же самое внутри foo (), это было отдельной областью, и это было приемлемо.Но обратите внимание, что 'класс S' внутри foo () НЕ тот же тип, который объявлен в первой строке.

0 голосов
/ 30 ноября 2011

Вне функции вы не можете объявить класс с тем же именем, что и typedef в том же пространстве имен.

Внутри функции вы объявляете новый класс в области видимости. Это не то же самое, что анонимный класс, объявленный в окружающем пространстве имен. Внутри функции это скрывает объявление typedef.

...