我有一个模板类,它使用一个策略输出它,另一个模板参数确定它的数据成员的类型。此外,构造函数获取指向存储在私有指针中的基类的指针。这个对象的函数应该使用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是一个接口,应该实现。它看起来像这样:
class ShapeGenerator {
public:
void generateShape (ModelCreator* m) = 0;
};
如果我用g ++ 4.3.4(cygwin)编译它,我在ShapeGenerator :: generateShape中遇到错误'ModelCreater' is not a type
。我提出了ModelCreator的前向声明,但它没有改变任何东西。我玩了一些类型和参数的组合,例如只传递向量,然后我收到一条错误消息,说明了不完整的类型。我想这就是问题所在。
那么,是否可以传递模板类型而没有特定的争论?如果是这样,怎么样?
修改 我没有绑定ModelCreator类型名称。如果我必须写更多模板,这不是问题。但我不想在ShapeCreator对象中指定ModelCreator的类型。这可能吗?
EDIT2: 好吧,我想我对这个“设计”有点乐观。如果只是投入一些食物并获得汤,那将是一件好事。但现在盐必须知道锅里的水的种类。我将模板更改为普通的旧组合。谢谢你们。
答案 0 :(得分:3)
如果您想将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;
答案 1 :(得分:1)
您还需要将ShapeGenerate设为模板类:
template <typename PointData, typename OutputPolicy>
class ShapeGenerator;
template <typename PointData, typename OutputPolicy>
class ModelCreator {
private:
OutputPolicy output;
ShapeGenerator< PointData, OutputPolicy >* shape;
std::vector<PointData> data;
public:
ModelCreator (ShapeGenerator< PointData, OutputPolicy >* s) : shape(s) { }
void createShape();
};
template <typename PointData, typename OutputPolicy>
class ShapeGenerator {
public:
void generateShape (ModelCreator< PointData, OutputPolicy> * m) = 0;
};
template <typename PointData, typename OutputPolicy>
void ModelCreator< PointData, OutputPolicy >::createShape() { shape->generateShape(this); }