【发布时间】:2014-12-24 07:40:39
【问题描述】:
namespace X {
void f();
}
void X::f() {
void g();
g();
}
我是声明了::g,还是X::g?
如果我添加X::g 的定义,clang 3.5 将编译并链接它:
namespace X {
void f();
}
void X::f() {
void g();
g();
}
void X::g() { }
gcc 4.9.1 拒绝带有消息的定义:
错误:'void X::g()' 应该在'X'中声明
但如果我改为在全局命名空间中定义g,gcc 似乎会改变主意并抱怨相反的情况:
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)
【问题讨论】:
标签: c++ c++11 namespaces scope language-lawyer