Определение члена пространства имен

namespace M{
   void f();
   void M::f(){}
}

int main(){}

Приведенный выше код дает ошибку следующим образом:

«ComeauTest.c», строка 3: ошибка: полное имя не разрешено в объявлении члена пространства имен void M::f(){}

А также

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

Но

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

Мои вопросы:

а) Каково ожидаемое поведение?

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


person Chubsdad    schedule 24.11.2010    source источник


Ответы (2)


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

С++ 03 Раздел $ 8.3 говорит

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

Таким образом, ваш код плохо сформирован.

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

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

person Prasoon Saurav    schedule 24.11.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 считается за пределами определения пространства имен.

person Šimon Tóth    schedule 24.11.2010