Определение члена пространства имен - PullRequest
6 голосов
/ 24 ноября 2010
namespace M{
   void f();
   void M::f(){}
}

int main(){}

Приведенный выше код выдает ошибку примерно так:

"ComeauTest.c", строка 3: ошибка: квалифицированное имя не допускается в член пространства имен декларация пустота M :: f () {}

И

G ++ также выдает ошибку.

Но

VS2010 компилируется нормально.

Мои вопросы:

а) Какое поведение ожидается?

b) $ 7.3.1.2, похоже, не говорит об этом ограничении. Какая часть Стандарта определяет поведение такого кода?

Ответы [ 2 ]

5 голосов
/ 24 ноября 2010

Какая часть стандарта определяет поведение такого кода?

C ++ 03 Раздел $ 8,3 говорит

Идентификатор объявления не должен быть квалифицирован за исключением определения функции-члена (9.3) или статического члена-данных (9.4) вне его класса, определения или явного создания экземпляра функции или переменного члена пространства имен вне его пространства имен, или определение ранее объявленной явной специализации вне его пространства имен, или объявление функции-друга, которая является членом другого класса или пространства имен (11.4).

Итак, ваш код неверен.

Однако при обсуждении вопроса 548 CWG согласилась с тем, что запрет квалифицированных деклараторов внутри их пространства имен следует снять

1: Активная проблема 482

0 голосов
/ 24 ноября 2010

7.3.1.2-2 конкретно говорит об этом:

Members of a named namespace can also be defined outside that namespace by explicit qualification (3.4.3.2) of the name being defined, provided that the entity being defined was already declared in the namespace and the definition appears after the point of declaration in a namespace that encloses the declaration’s namespace.

M::f считается вне определения пространства имен.

...