对于令人困惑的标题感到抱歉,但我会在这里详细说明。我无法通过搜索找到这个特殊问题,所以如果我错过了,请指出我正确的主题......
我有一个依赖于一个参数的类模板,我将其用作基类:
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类之后的分号。说实话,我以前从未尝试过这种类型的模板安排,所以我想知道是否还有其他人这样做过。如果是这样,是否存在我正在制作的基本语法错误或其他问题?提前感谢您提供的任何帮助或指导!
答案 0 :(得分:4)
如果在类名后面使用任何角度括号,则表示模板专门化,而不是主模板。正确的主要类模板是:
template <class TVertex, class TInstance>
class DrawInstancedExecutorDX11 : public DrawExecutorDX11<TVertex>
{
//...
};
在该类中,您可以引用模板参数TVertex
和TInstance
,在该类之外,您可以使用DrawInstancedExecutorDX11<SomeVtxType, SomeInstType>
。
答案 1 :(得分:1)
您尝试在未声明主模板定义的情况下声明部分特化。在声明DrawInstancedExecutorDX11<TInstance>
之前,您需要
template <class TVertex, class TInstance>
class DrawInstancedExecutorDX11;
这应该可以解决您的第一个编译错误,但之后会失败。我不确定你实际上是想用这个来完成什么。看来你只需要:
template <class TVertex, class TInstance>
class DrawInstancedExecutorDX11 : public DrawExecutorDX11<TVertex>
{ ... };