我有一个模板类,该模板类为其输出使用策略,并使用另一个模板参数来确定其数据成员的类型。此外,构造函数采用指向存储在私有(private)指针中的基类的指针。该对象的功能应使用指向模板类的this指针,以使它们能够访问数据。在代码中,如下所示:
class ShapeGenerator;
template <typename PointData, typename OutputPolicy> class ModelCreator {
private:
OutputPolicy output;
ShapeGenerator* shape
std::vector<PointData> data;
public:
ModelCreator (ShapeGenerator *s) : shape(s) { }
void createShape() { shape->generateShape(this); }
};
ShapeGenerator是一个接口(interface),应予以实现。看起来像这样:
class ShapeGenerator {
public:
void generateShape (ModelCreator* m) = 0;
};
如果我使用g++ 4.3.4(cygwin)进行编译,则会在ShapeGenerator::generateShape中收到错误消息,提示
'ModelCreater' is not a type
。我输入了ModelCreator的前向声明,但它没有改变。我玩了一些类型和参数的组合,例如只传递 vector ,然后收到一条错误消息,说明不完整的类型。我想这就是这里的问题。因此,是否可以在没有特定争论的情况下传递模板化类型?如果是这样,怎么办?
编辑:
我不受ModelCreator类型名称的约束。如果我必须编写更多类似模板的文件,这不是问题。但是我不想在ShapeCreator对象中指定ModelCreator的类型。那可能吗?
编辑2:
好的,我想我对这个“设计”有点乐观。放一些礼节去喝汤会很好。但是现在盐必须知道锅里的水的种类。我将模板更改为普通的旧组合。谢谢你们
最佳答案
如果要使用带有“免费”模板参数的ModelCreator
,则也必须使ShapeGenerator
为模板:
template <typename PointData, typename OutputPolicy>
class ShapeGenerator {
public:
void generateShape (ModelCreator<PointData,OutputPolicy>* m) = 0;
};
要么
template <template <typename, typename> class ModelCreator>
class ShapeGenerator {
public:
void generateShape (ModelCreator* m) = 0;
};
第二个版本采用另一个模板作为参数。您可以这样使用它:
ShapeGenerator<ModelCreator<PointDataType,OutPutPolicyType> > shapeGenerator;