2012-12-19 8 views
5

を継承するクラステンプレートの宣言が、私はもっとここに詳しく説明しようとするでしょう。私は はC++で別のクラステンプレートから紛らわしいタイトルのために申し訳ありません

は私がベースとして使用していますつのパラメータに依存クラステンプレートを持っている...私はそれを見逃している場合は、右のスレッドに私をポイントしてくださいので、検索経由して、この特定の問題を見つけることができませんでしたクラス:

template <class TVertex> 
class DrawExecutorDX11 
{ 
public: 
    DrawExecutorDX11(); 
    virtual ~DrawExecutorDX11(); 
    void AddVertex(const TVertex& vertex); 

protected: 
    TGrowableVertexBufferDX11<TVertex> VertexBuffer; 
}; 

私がやりたいことは、このクラスのテンプレートから継承することであり、同時にサブクラスに別のクラスのテンプレートパラメータを追加します。私は、この構成は、私はそうのようなサブクラスのテンプレートのインスタンスを宣言できるようになることを期待しています

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11<TInstance> : public DrawExecutorDX11<TVertex> 
{ 
public: 
    DrawInstancedExecutorDX11(); 
    virtual ~DrawInstancedExecutorDX11(); 

    void AddInstance(const TInstance& data); 

protected: 
    TGrowableVertexBufferDX11<TInstance> InstanceBuffer; 
}; 

:構文での私の試みは、このようなものになるだろう

DrawInstancedExecutorDX11<VertexStruct,InstanceStruct> myExecutor; 

しかし、VS2012は、」doesnのサブクラスのコンパイルも検討し、クラスDrawInstancedExecutorDX11の後にセミコロンが必要であることを示しています。正直言って、このタイプのテンプレートアレンジメントをこれまでに試したことはないので、他の誰かがこれをやったのかと思っています。もしそうなら、私が作っている基本的な文法間違いやその他の落とし穴がありますか?あなたが与えることができる任意の助けや指導のために事前に感謝!

答えて

4

クラス名の直後に角かっこを使用すると、プライマリテンプレートではなくテンプレートの特殊化が宣言されています。正しいプライマリクラステンプレートは次のようになります。そのクラス内

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11 : public DrawExecutorDX11<TVertex> 
{ 
    //... 
}; 

テンプレートパラメータTVertexTInstanceを参照することができ、そのクラスの外にあなたがDrawInstancedExecutorDX11<SomeVtxType, SomeInstType>を使用することができます。

+0

の横に空のチェックマークが表示されるはずです。答えに感謝します(@ K-balloと同時に回答しました)。それはまた、答えにいくつかの追加のコンテキストを追加します。再度、感謝します! –

1

プライマリテンプレート定義を宣言せずに部分的な特殊化を宣言しようとしています。 DrawInstancedExecutorDX11<TInstance>の宣言の前に、あなたの最初のコンパイラエラーの乗り心地を得るが、その後失敗する

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11; 

が必要になります。私はあなたが実際にこれで達成しようとしていることをよく分かりません。

template <class TVertex, class TInstance> 
class DrawInstancedExecutorDX11 : public DrawExecutorDX11<TVertex> 
{ ... }; 
+0

Iは、(「VertexBuffer」メンバーを使用)のいずれかの操作セットを提供する基本クラスを定義しようとし、次いで(「InstanceBuffer」メンバーを使用して)動作の他のセットとその機能の一部を専門にしています。通常の継承との唯一の相違点は、2つのメンバ変数のタイプが汎用的であることです。 –

+1

@Jasonジンク:公共DrawExecutorDX11 ':次に、あなただけの'テンプレート<クラスTVertex、クラスTInstance>クラスDrawInstancedExecutorDX11したくないですか? –

+0

はい!それは問題でした。サブクラス宣言にテンプレート引数を追加すべきではありません。助けてくれてありがとう - 私はそれがいくつかの小さな構文エラーであることを知っていた!どのように答えにクレジットを与えることができますか? –

関連する問題