我不明白为什么这段代码无法编译:
namespace A {
class F {}; // line 2
class H : public F {};
}
namespace B {
void F(A::H x); // line 7
void G(A::H x) {
F(x); // line 9
}
}
我正在使用
gcc 4.3.3
,错误是:s3.cpp: In function ‘void B::G(A::H)’:
s3.cpp:2: error: ‘class A::F’ is not a function,
s3.cpp:7: error: conflict with ‘void B::F(A::H)’
s3.cpp:9: error: in call to ‘F’
我认为,因为在第9行中没有 namespace 前缀,所以
F(x)
应该明确地仅意味着B::F(x)
。编译器尝试将x
转换为其自己的父类(super class)。以我的理解,它不应该。为什么这样做呢? 最佳答案
这是因为编译器将在其参数来自的相同 namespace 中搜索函数。编译器在其中找到了A::F
标识符,但这不是一个函数。结果,您将得到错误。
据我所记得,这是标准行为。
该规则允许您编写以下代码:
std::vector<int> x;
// adding some data to x
//...
// now sort it
sort( x.begin(), x.end() ); // no need to write std::sort
最后:由于有了Core Issue 218,某些编译器将编译有问题的代码而没有任何错误。
关于c++ - C++中的命名空间冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1139063/