7

これが私が達成したいことです。リーフ コンポーネントは を継承Component<ParentT>し、他のコンポーネントは継承します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;
  ...
};

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

エラー: 2 つのテンプレート パラメーターで再宣言されました
注: 以前の宣言 'テンプレート クラス コンポーネント' は 1 つのテンプレート パラメーターを使用しました

4

1 に答える 1

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;
}

someTあります。ParentComponentT_someT2CollectionT

編集:

以下のコメント/質問への回答:typename ChildT=noneTデフォルトChildTが になることを意味しますnoneT。したがって、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;
};
于 2012-08-05T07:43:58.400 に答える