1

我有一个模板类,它使用一个策略作为它的输出和另一个模板参数来确定它的数据成员的类型。此外,构造函数采用指向存储在私有指针中的基类的指针。此对象的函数应采用指向模板类的 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 的类型。那可能吗?

编辑2: 好的,我想我对这个“设计”有点乐观。加入一些配料并喝汤就好了。但是现在盐必须知道锅里的水的种类。我会将模板更改为普通的旧构图。谢谢你们。

4

2 回答 2

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; 
于 2010-07-09T15:55:54.057 回答
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); }
于 2010-07-09T15:57:01.450 回答