繁体   English   中英

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

[英]Incomplete type as function parameter?

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

如果要将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; 

您还需要使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); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM