代码之家  ›  专栏  ›  技术社区  ›  Erik Öjebo

如何解决使用c头时的名称冲突?

  •  1
  • Erik Öjebo  · 技术社区  · 16 年前

    给定以下代码:

    // Global method
    int foo(int x)
    {
        return x;
    }
    
    // Class that calls the global method
    class FooBar
    {
    public:
        void foo() { return; };
        void baz() { foo(1); }
    };
    

    g++给出以下错误消息:

    test.cpp: In member function ‘void FooBar::baz()’:
    test.cpp:10: error: no matching function for call to ‘FooBar::foo(int)’
    test.cpp:9: note: candidates are: void FooBar::foo()
    

    重命名类方法可以解决这个问题。

    谢谢 /埃里克

    3 回复  |  直到 16 年前
        1
  •  8
  •   Johannes Schaub - litb    16 年前

    问题是它首先在类的范围内查找,并找到一个foo函数。然后查找将停止,编译器将尝试匹配参数。因为它在类的该作用域中只有一个foo函数,所以调用该函数失败。

    您需要明确声明要调用free函数:

    ::foo(1);
    

    void baz() { int foo(int); foo(1); }
    

    假定foo函数在其中定义的范围是类的周围名称空间。

        2
  •  3
  •   jab    16 年前

    您必须使用范围解析,请尝试:

        3
  •  2
  •   Steve Jessop    16 年前

    解决办法是:

    void baz() { ::foo(1); }
    

    “为什么即使方法签名不同,也存在某种命名冲突?”

    foo() foo(int) 自由函数在其作用域中的任何位置(即,在类的其他成员函数中)。

    出于相同的原因,以下代码将无法编译:

    struct A {
        virtual void foo(int) = 0;
        // attempt to provide a useful helper
        virtual void foo() { foo(23); }
    };
    
    struct B : public A {
        void foo(int i) {
            std::cout << i << "\n";
        }
    };
    
    int main() {
        B b;
        b.foo(); // oops, can't find foo(), because class B hid it
        A &a = b;
        a.foo(); // that works. So much for Liskov's substitution principle.
    }
    

    B、 正如所写的,它被破坏了,因为它从基类中删除了功能(尽管只有在被称为B时,而不是在被称为A时)。litb在下面的一条评论中提供了一个链接,解释了如何破解它。