Помогите, проясните мои сомнения по поводу неквалифицированного поиска имени: ISO N3290 Draft - PullRequest
2 голосов
/ 25 июля 2011

По этой ссылке

Точка из C ++ 0x осадка: n3290

Должна ли эта программа быть правильной?

EX:
namespace  X {};
enum Foo
  {
      X = 0,     #1
      Y,
      Z = X // X refers to the enum, not the type
  };

Я получаю сообщение об ошибке при выполнении этой программы, например, // # 1 'X' объявлен как символ другого типа

Но в приведенном выше операторе ссылка ... области имен, содержащие спецификатор enum. ... и т. д.

уточните, пожалуйста, мои сомнения.

В противном случае, пожалуйста, приведите пример, подтверждающий приведенное выше утверждение (в ссылке) с пространством имен

.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Существует разница в том, что в первоначальном вопросе вместо namespace X было указано struct X.Имя пространства имен видимо в этой области, как и Foo :: X, так как имена перечислений «просачиваются» в окружающее пространство имен.Это создает конфликт.

В C (и, следовательно, также в C ++) имя struct / class / union находится в отдельном «пространстве имен тегов» (термин C с другим значением), что позволяет намобъявить другой элемент с тем же именем в той же области видимости:

Разница между 'struct' и 'typedef struct' в C ++?

0 голосов
/ 25 июля 2011

Программа незаконна.enum не вводит отдельную область (если вы не используете C ++ 11 и добавьте к ней class), и пространство имен X, и константа перечисления X находятся вта же сфераЕсть только два случая, когда одно и то же имя может быть определено более одного раза в одной и той же области: перегруженные функции и одно имя класса.Особый случай имени класса предназначен исключительно для совместимости с C, так что API C с такими функциями, как:

struct stat { ... };
int stat(const char* path, struct stat* buf);

, не сломается.Если присутствует и имя класса, и другое имя, другое имя имеет приоритет, если ему не предшествует ключевое слово класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...