命名空间成员定义

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

int main(){}

上面的代码会出现如下错误:
"ComeauTest.c", line 3: error: qualified name is not allowed in namespace member declaration void M::f(){}
同时,G++也会报错。但是,在VS2010中可以编译通过。
我的问题是:
a)期望的行为是什么?
b)$7.3.1.2似乎没有讨论这种限制。标准的哪个部分指导了这种代码的行为?
2个回答

5
“标准的哪一部分指导了这段代码的行为?”
C++03第8.3节规定:
“除了在其类的成员函数(9.3)或静态数据成员(9.4)的定义之外,声明符ID不得被限定,在其名称空间以外的命名空间中的函数或变量成员的定义或显式实例化,以前声明的显式专门化的定义超出其名称空间,或者是另一个类或名称空间的成员的友元函数的声明(11.4)。 ”
因此,您的代码是不正确的。
但是,在讨论问题548时,CWG同意解除在其名称空间内限制修饰符声明符的禁令11 : 活动问题482

0

7.3.1.2-2 特别讨论了这个问题:

通过显式限定名(3.4.3.2)定义名称时,命名空间的成员也可以在该命名空间之外定义,前提是被定义的实体已经在命名空间中声明,并且定义出现在包含声明的命名空间中的声明点之后。

M::f 被认为是命名空间定义之外的定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接