5

タイトルがわかりにくいので申し訳ありませんが、ここで詳しく説明します。私は検索でこの特定の問題を見つけることができなかったので、それを見逃した場合は、正しいスレッドを教えてください...

基本クラスとして使用している1つのパラメーターに依存するクラステンプレートがあります。

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はサブクラスのコンパイルも考慮せず、クラスDrawInstancedExecutorDX11の後にセミコロンが必要であることを示しています。正直なところ、私はこれまでこの種のテンプレートの配置を試したことがないので、他の誰かがこれを行ったことがあるのではないかと思います。もしそうなら、私が作っている基本的な構文の間違いや他の落とし穴はありますか?あなたが与えることができるどんな助けまたはガイダンスにも前もって感謝します!

4

2 に答える 2

4

クラス名の直後に山かっこを使用すると、プライマリテンプレートではなく、テンプレートの特殊化を宣言することになります。正しいプライマリクラステンプレートは次のとおりです。

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

そのクラス内ではテンプレートパラメータTVertexとを参照できTInstance、そのクラス外ではを使用できますDrawInstancedExecutorDX11<SomeVtxType, SomeInstType>

于 2012-12-19T19:49:46.810 に答える
1

プライマリテンプレート定義を宣言せずに、部分的な特殊化を宣言しようとしています。DrawInstancedExecutorDX11<TInstance>あなたの宣言の前に

template <class TVertex, class TInstance>
class DrawInstancedExecutorDX11;

これで最初のコンパイラエラーが解消されるはずですが、その後は失敗します。あなたが実際にこれで何を達成しようとしているのかわかりません。必要なのは次のようです。

template <class TVertex, class TInstance>
class DrawInstancedExecutorDX11 : public DrawExecutorDX11<TVertex>
{ ... };
于 2012-12-19T19:32:09.977 に答える