5

抱歉标题令人困惑,但我会在这里尝试详细说明。我无法通过搜索找到这个特殊问题,所以如果我错过了,请指出我正确的线程......

我有一个依赖于我用作基类的一个参数的类模板:

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>
{
    //...
};

在该类内部,您可以引用模板参数TVertexTInstance,在该类外部您可以使用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 回答