2011-12-13 4 views
3

は私がのtypedefの束を持つ2つの基本クラスを持っているとします複数の継承の下で1つの基本クラスからすべてのtypedefを継承する方法はありますか?

struct X { 
    typedef int type1; 
    typedef float type2; 
    // A bunch of other typedefs. 
}; 

struct Y { 
    typedef long type1; 
    typedef char type3; 
    // Some other typedefs. 
}; 

struct Z : public X, public Y { 
}; 

どのように私はZが手動で各タイプの競合を解決せずに、Xからすべてのtypedefを継承させたい指定するのですか? O(n)の代わりにこれを達成するためのO(1)コードを意味します。ここで、nは競合タイプの数です。また、メタプログラミングの場合、XとYの正確な型定義を知らないので、手動による解決の競合は不可能です。

単一継承の場合、自動的に基本クラスのtypedefが使用されるため、手動で指定する必要はありません。

+0

必要なすべてのタイプをヘッダファイルに入れてみませんか? –

答えて

2

使用privateまたはその代わりpublic相続のprotected相続、その後、例えばあなたがZで使用するアイテムを、宣言するusingステートメントを使用します。

struct Z : protected X, protected Y 
{ 
    using X::type1; 
    using X::type2; 
    // ... 
}; 
+0

GCCは混乱しているようです。 –

4

オムは、それだけで正常に動作します。あなたは衝突を解決する必要があります。

struct X 
{ 
    typedef int type1; 
    typedef int type2; 
}; 

struct Y 
{ 
    typedef double type1; 
}; 

struct Z : public X, public Y 
{ 
    type2 z1; 
    typedef X::type1 type1; 
    type1 z2; 
}; 

int main() 
{ 
    Z z; 
    Z::type2 x; 
    Z::type1 y; 
} 
+0

あなたの答えは動作しますが、競合を解決するには手作業が必要です。私は私が探しているものを明確にするために質問を更新しました。とにかくあなたの答えをありがとう。 –

+1

@icandoできません。競合を手動で解決する必要があります。 –

関連する問題