C++ C+中嵌套函数声明的范围+;
我是否声明了C++ C+中嵌套函数声明的范围+;,c++,c++11,namespaces,scope,language-lawyer,C++,C++11,Namespaces,Scope,Language Lawyer,我是否声明了::g,或X::g 如果我添加X::g的定义,Clang3.5将编译并链接此文件: namespace X { void f(); } void X::f() { void g(); g(); } gcc 4.9.1拒绝包含以下信息的定义: 错误:“void X::g()”应在“X”中声明 但是如果我在全局名称空间中定义g,gcc似乎会改变主意并抱怨相反的情况: 由于在f中声明void::g()也是非法的,因此似乎不可能在命名空间函数中具有全局函数的函数作
::g
,或X::g
如果我添加X::g
的定义,Clang3.5将编译并链接此文件:
namespace X {
void f();
}
void X::f() {
void g();
g();
}
gcc 4.9.1拒绝包含以下信息的定义:
错误:“void X::g()”应在“X”中声明
但是如果我在全局名称空间中定义g
,gcc似乎会改变主意并抱怨相反的情况:
由于在f
中声明void::g()
也是非法的,因此似乎不可能在命名空间函数中具有全局函数的函数作用域前向声明。我错过什么了吗?这里的范围界定规则是什么
g++(GCC)4.9.1;Apple LLVM版本6.0(clang-600.0.54)(基于LLVM 3.5svn)块范围内的函数声明具有链接。[基本链接]/6: 在块作用域中声明的函数名,[..]具有链接 但这种带有链接的块范围声明不会将任何名称引入封闭的名称空间。[基本链接]/7: 未找到具有链接的实体的块范围声明时 若要引用其他声明,则该实体是 最里面的封闭命名空间但是,这样的声明并不适用 在其命名空间范围中引入成员名称。 因此,您既没有声明
::g
,也没有声明X::g
。通过
Undefined symbols for architecture x86_64:
"X::g()", referenced from:
X::f() in ccABCDEF.o
他身体不好
Undefined symbols for architecture x86_64:
"X::g()", referenced from:
X::f() in ccABCDEF.o
void X::g() {}