中的命名空间冲突

中的命名空间冲突

我不明白为什么这段代码无法编译:

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/

10-12 20:33