2014-10-28 30 views
13
namespace X { 
    void f(); 
} 

void X::f() { 
    void g(); 
    g(); 
} 

我是否声明了::gX::gC++中嵌套函数声明的范围

铛3.5将编译和链接,如果我加X::g一个定义:

namespace X { 
    void f(); 
} 

void X::f() { 
    void g(); 
    g(); 
} 

void X::g() { } 

GCC 4.9.1拒绝与消息的定义:

error: ‘void X::g()’ should have been declared inside ‘X’

,但如果我定义g在全球命名空间,海湾合作委员会似乎改变了主意,并抱怨相反:

Undefined symbols for architecture x86_64: 
    "X::g()", referenced from: 
     X::f()  in ccABCDEF.o 

因为在f之内声明void ::g()也是非法的,所以似乎不可能在名称空间函数中具有全局函数的函数范围前向声明。我错过了什么吗?这里的范围规则究竟是什么?

g ++(GCC)4.9.1; Apple LLVM 6.0版(clang-600.0.54)(基于LLVM 3.5svn)

回答

6

块范围的函数声明具有链接。 [basic.link]/6:

The name of a function declared in block scope and [..] have linkage.

但是,这种带连接的块范围声明不会将任何名称引入到包含名称空间中。 [basic.link]/7:

When a block scope declaration of an entity with linkage is not found to refer to some other declaration, then that entity is a member of the innermost enclosing namespace. However such a declaration does not introduce the member name in its namespace scope.

您已因此既不宣布::g也不X::g。通过定义它

void X::g() {} 

是不合格的。