2012-08-05 13 views
6

これは私が達成したいものです。葉のコンポーネントは、他の人がComponent<ParentT, ChildT>テンプレートパラメータの再宣言

template <typename T> 
class Component{ 
    protected: 
    typedef Component<T> ParentComponentT; 
    ... 
}; 

template <typename ParentT, typename ChildT> 
class Component: public Component<ParentT>{ 
    protected: 
    typedef std::vector<ChildT*> CollectionT; 
    ... 
}; 

を継承し、Component<ParentT>継承されます。しかし、問題は、テンプレートのパラメータが再宣言なっています。 2番目のものが最初のものを継承するので、2番目のものを最初のものの上に移動することはできません。

error: redeclared with 2 template parameter(s)
note: previous declaration ‘template class Component’ used 1 template parameter(s)

+1

現在、可変長テンプレートを無視すると、テンプレートには固定数のパラメータがあります。 1つの「Component <>」は1つのパラメータと2つのパラメータの両方を持つことはできません。これは[XY問題](http://meta.stackexchange.com/q/66377/166663)のようになります。実際に何を達成しようとしていますか? – ildjarn

+0

それをモデル化する良い方法は何ですか? 'Component '? –

+0

それは依存します - あなたはなぜベースと同じ名前を持つ子供を望みますか?それらに異なるタイプの名前を付けてください。問題はありません。 – ildjarn

答えて

3

これは、コンパイルされ、私の知る限り理解し、あなたが好きなものを行います。

#include <vector> 

class NoneT {}; 

template <typename ParentT,typename ChildT=NoneT> 
class Component: public Component<ParentT>{ 
    protected: 
    typedef std::vector<ChildT*> CollectionT; 
}; 

専門NoneTのために:

template<> 
template<typename T> 
class Component<T,NoneT>{ 
protected: 
    typedef Component<T> ParentComponentT; 
}; 

int main(){ 
    typedef Component<double> someT; 
    typedef Component<double,int> someT2; 
    typedef Component<double,void> someT3; 
} 

someTParentComponentTsomeT2CollectionTを持つことになりますがあります。

EDIT:以下/質問コメントする

回答:typename ChildT=noneTはデフォルトChildTnoneTになることを意味します。したがって、2番目のテンプレート引数が指定されない場合、noneTタイプが使用されます。

特殊化は、その1引数バージョンのクラス内容を定義します。

はEDIT2:

私はあなたが基本クラスとしてコンポーネントを使用したチャットから知っているので、私が代わりに

class myclass: public Component<Section, Line> 

のようなもので、あなたが多重継承を使用することができることを示唆

class myclass: public ParentComponent<Section>, CollectionComponent<Line> 

template <typename T> 
class ParentComponent{ 
    protected: 
    typedef Component<T> ParentComponentT; 
}; 

template <typename ChildT> 
class CollectionComponent { 
    protected: 
    typedef std::vector<ChildT*> CollectionT; 
}; 
+0

最初のテンプレートの場合は 'ChildT = NoteT'または' ChildT = void'ですか? –

+0

の場合は2番目のテンプレートに特化しています –

+0

2番目のテンプレート引数が指定されていない場合、テンプレートの2番目のバージョンに移動します。なぜそれがデフォルトのパラメータを探しますか? –

関連する問題