不完整类型作为功能参数?

时间:2010-07-09 15:44:27

标签: c++ templates forward-declaration

我有一个模板类,它使用一个策略输出它,另一个模板参数确定它的数据成员的类型。此外,构造函数获取指向存储在私有指针中的基类的指针。这个对象的函数应该使用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: 好吧,我想我对这个“设计”有点乐观。如果只是投入一些食物并获得汤,那将是一件好事。但现在盐必须知道锅里的水的种类。我将模板更改为普通的旧组合。谢谢你们。

2 个答案:

答案 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); }