2011-06-18 1 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:2番目のCの例でスコープを更新しました。 A::A1::attach(a)

UPDATEは:C++プログラマーとしての私の18年間で

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

、私はそのように「を使用して」を使用しなければならなかったことがありません:重複は以下に記載調べるとき、私は解決策に出くわしました。私はそれが存在するかどうかも知らなかった。

+0

@Xeo:私は重複しているとは思っていません。 – Puppy

+1

@DeadMG:Ehm ..私の質問のタイトルの最初の単語は何ですか? – Xeo

+0

@ Xeoは正しいです。それは複製です。答えはそこにあります。私は、(驚くべきことに)解決策を入れるために質問を更新しました。 – Blazes

答えて

2

あなたはクラスCでこれを書くことができます。代わりに

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

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

この機能は、壊れやすい基本クラスの問題を避けるためです。これが期待どおりに機能した場合、A :: A1にB :: B1参照を使ったオーバーロードが追加されるとどうなるか考えてみましょう。突然、すべて何も変更していないにもかかわらず、あなたのコールサイトが曖昧です。これはでさえ、が過負荷の場合はtrueプライベートです。

私の意見では、派生クラスやその他の問題を壊すことができる百万円があるので、これは非常に意味がありません。しかし、それは明らかな根拠です。

関連する問題