поиск пространства имен в с ++ - PullRequest
4 голосов
/ 02 февраля 2012

Я обнаружил проблему, связанную с поиском в пространстве имен. Не удалось скомпилировать следующий упрощенный код:

namespace A {
  namespace B { 
    class Test {
    };
  }
  namespace C {
    namespace B {
      typedef B::Test AnAlias;
    }
  }
}

Компилятор жалуется, что Test в пространстве имен A::C::B не называет тип.

Похоже, проблема в том, что компилятор видит пространство имен B внутри пространства имен C и не выполняет дальнейший поиск. Я ожидал, что он также посмотрит в пространство имен A (которое является пространством имен) и найдет там B :: Test.

Если я переименую C::B, то все в порядке.
Если я подхожу A::B::Test все хорошо.
Если я поместил typedef непосредственно в пространство имен A::C, то все в порядке.

Это поведение было протестировано с gcc 4.1 и компилятором intel 12. (оба для Linux).

Верны ли компиляторы?

1 Ответ

5 голосов
/ 02 февраля 2012

B в typdef B::Test разрешается до A::C::B. Если вы собираетесь повторно использовать имя B, вам необходимо указать его, чтобы устранить неоднозначность. Компиляторы ведут себя правильно. IIRC, имена разрешены к ближайшей декларации для его использования или ссылки. В этом случае A::C::B является ближайшим объявлением к typedef.

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