2011-06-18 129 views
1

Possible Duplicate:
Why do multiple-inherited functions with same name but different signatures not get treated as overloaded functions?暧昧访问

我得到一个错误:

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安装方法,以及现在编译器得到它,但我不希望有定义所有这些连接方法:

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(){ } 
}; 

在我这18年的C++程序员,我从来没有使用“使用”这样的。我甚至不知道存在。

+0

@Xeo:我不认为这是重复的 - 他想知道*为什么*。 – Puppy

+1

@DeadMG:恩......我的问题标题中的第一个单词是什么? – Xeo

+0

@Xeo是对的。它是重复的。答案就在那里。我更新了问题以包含(相当令人惊讶的)解决方案。 – Blazes

回答

2

可以在C类这样写:

using A::A1::attach; 
using B::B1::attach; 

而不是

void attach(A & a) { A::A1::attach(a); } 
void attach(B & b) { B::B1::attach(b); } 
3

此功能是为了避免脆基类的问题。考虑一下如果按照你的预期工作会发生什么 - 然后A :: A1增加一个带B :: B1引用的重载。突然间,全部您的通话网站不明确 - 即使您没有更改任何内容。这是,即使如果过载是私人的,则为true。

当然,在我看来,这是非常没有意义的,因为有100万其他方法可以打破你的派生类和其他问题。但这是明显的理由。