这个问题已经在这里有了答案:




9年前关闭。






我收到一个错误:

ambiguous access of 'attach'
    could be the 'attach' in base 'A::A1'
    or could be the 'attach' in base 'B::B1'

这是代码:
class A
{
public:
    class A1
    {
    public:
        virtual void attach( A & a ) { }
    };
public:
};

class B
{
public:
    class B1
    {
    public:
        virtual void attach( B & b ) { }
    };
public:
};

class C : public A::A1, public B::B1
{
public:
    C(){ }
};

void main(int argc, char *argv[])
{
    A a;
    B b;
    C c;
    c.attach( a );
    c.attach( b );
}

我了解错误。编译器很困惑,它需要范围:
c.A::A1::attach( a );
c.B::B1::attach( b );

这种语法太可怕了。我可以在C中定义attach方法,现在编译器可以获取它,但是我不想定义所有这些attach方法:
class C : public A::A1, public B::B1
{
public:
    C(){ }
void attach( A & a ) { A::A1::attach(a); }
void attach( B & b ) { B::B1::attach(b); }
};

谁能向我解释为什么编译器在明确(我的想法)应该使用哪种“附加”时对“附加”感到困惑?谁能提供不需要范围界定的解决方案?

UPDATE :更新了我的第二个C示例中的范围,例如A::A1::attach(a)
UPDATE :在调查下面指出的重复项时,我遇到了解决方案:
class C : public A::A1, public B::B1
{
public:
    using A::A1::attach;
    using B::B1::attach;
public:
    C(){ }
};

在我从事c++程序员的18年中,我从未像这样使用过“using”。我什至不知道那存在。

最佳答案

此功能是为了避免脆弱的基类问题。考虑一下,如果这按预期工作会发生什么,然后A::A1使用B::B1引用添加了一个重载。突然,您的所有 call 站点都模棱两可-即使您没有进行任何更改。如果重载是私有(private)的,这甚至是正确的。

当然,在我看来,这是毫无意义的,因为有数百万种其他方法可以解决派生类和其他问题。但这就是显而易见的理由。

关于c++ - 模棱两可的访问[重复项],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6397938/

10-11 18:01