2012-03-05 8 views
4

複数の継承を使用して同じvar名('aa ')と第3の構造体(' CCC ')を含む2つの構造体(' AAA 'と' BBB ' [2つの構造は無関係であると考えられているので、2つのクラスが共通の祖先を持つ場合、これは有名なダイヤモンドの問題ではありません]。 派生した構造体 'CCC'のために私は、構造体 'AAA'の派生構造体でvarを扱うように明示的に選択しようとしましたが、gccはあいまいなdefについてまだ不平を言っています。どうして?gccの 'キーワード'を使用しています

struct AAA { int aa; }; 
struct BBB { int aa; }; 
struct CCC : public AAA , public BBB { using AAA::aa; }; 
int main() { CCC ccc; return ccc.aa; } 

ができます:

x.cpp: In function 'int main()': 
x.cpp:4:34: error: request for member 'aa' is ambiguous 
x.cpp:2:18: error: candidates are: int BBB::aa 
x.cpp:1:18: error:     int AAA::aa 
+0

私は個人的に_really_競合しない名前を使用しています。代わりに、スコープ解決演算子を使用してください。この演算子は、このケースでは少し面白く見えますが、あなたが望むものを非常に明確に表現しています: 'ccc.AAA :: aa'。 – Damon

答えて

5

aaはそのスコープ内に既に存在するので、それが失敗しました。 using AAA.aaはそれを再度スコープに持ち込むだけです。

これをタイプにキャストしてそのように抽出できます。

#include <iostream> 
struct AAA { 
    int aa; 
    AAA() : aa(1) {} 
    virtual ~AAA(){}; 
}; 
struct BBB { 
    int aa; 
    BBB() : aa(5) {} 
    virtual ~BBB(){}; 
}; 

struct CCC : public AAA , public BBB 
{ 
    CCC() : AAA(), BBB() {} 
// using AAA::aa; 
}; 

int main() 
{ 
    CCC ccc; 
    std::cout << static_cast<BBB*>(&ccc)->aa << std::endl; 
} 

これがsomehtingの場合、多くのことを行うつもりですが、その機能をカプセル化するほうが簡単かもしれませんが。

//member of CCC 
int get_aa() 
{ 
    return static_cast<BBB*>(this)->aa; 
} 
+0

関数やキャストを使うことは、実際には動作しません。 –

+0

を使用すると、現在のスコープ/ネームスペースにメンバーを持ち込みます(多かれ少なかれ)。 BBBのAAとAAAの両方が既にCCCに入っているので、usingコマンドは、コンパイラが動作するためのデフォルトを選択しません。 – 111111

+0

(varの代わりに)共有関数で試したところ、 'using'がその仕事をしているようです。また、Visual C++の変数でうまく動作します –

0

あなたは、関連するメンバーへのポインタを設定することができます。

struct AAA { int aa; }; 
struct BBB { int aa; }; 
struct CCC : public AAA , public BBB { 
    int *A_aa; int *B_aa; 
    CCC(): 
      A_aa(&static_cast<AAA*>(this)->aa), 
      B_aa(&static_cast<BBB*>(this)->aa) { } 
}; 

int main() { CCC ccc; return *ccc.A_aa; } 
+0

私は個人的にはあまり慣用的ではないので、このアプローチに対してアドバイスします。また、可能であれば、ポインタではなく参照を使用することをお勧めします。 – 111111

0

あなたはVirtual inheritanceを使用することができます。たとえば、このコードは次のように書き直す必要があります。

struct AAA { int aa; }; 
struct BBB { int aa; }; 
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; }; 
関連する問題