我有一个模板类,它为它的输出使用一个策略,并使用另一个模板参数来确定它的数据成员的类型。此外,构造函数接受指向存储在私有指针中的基类的指针。该对象的函数将接受指向模板类的此指针,以使它们能够访问数据。在代码中,如下所示:
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类型名。如果我必须写更多的模板-就像这不是问题。但是我不想在ModelCreator对象中指定ShapeCreator的类型。这有可能吗?
edit2: Ok,我想我对这个“设计”有点乐观。只要加些配料,喝点汤就好了。但是现在盐必须知道锅里的水的种类。我将把模板更改为普通的旧组合。谢谢你们。
发布于 2010-07-09 15:55:54
如果您想使用带有“空闲”模板参数的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-09 15:57:01
您还需要使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); }https://stackoverflow.com/questions/3214250
复制相似问题