2010-07-09 18 views
1

我有那个模板类,它使用它的输出的策略和另一个模板参数来确定它的数据成员的类型。此外,构造函数接受指向存储在私有指针中的基类的指针。这个对象的功能应该将这个指针指向模板类,以使它们能够访问数据。在代码中,这看起来像这样:不完整的类型作为函数参数?

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 typename。如果我必须写更多的模板,这不是问题。但是我不想在ShapeCreator对象中指定ModelCreator的类型。那可能吗?

编辑2: 好吧,我想我对这个“设计”有点乐观。只要投入一些成分并获得汤,本来就不错。但现在盐必须知道锅中的水的种类。我会将模板更改为普通的旧作曲。谢谢你们。

+4

您的设计需要改变。没有'ModelCreator'类型,这是一个模板类。它不能是你的函数的参数。 – GManNickG 2010-07-09 15:47:30

+0

我想出了一个模板生成所有给定类型使用的所有函数。所以最后有一堆重载的函数。因此,我认为它应该是与其他函数相同的东西,编译器知道在创建它的对象时的类型 – DaClown 2010-07-09 15:51:56

+0

我不确定我是否理解你的意思,但模板是什么所谓的实例化,只要所有的模板提供参数。编译器不可能通过浪费时间试图为每种类型的组合生成每个函数。 – GManNickG 2010-07-09 15:56:51

回答

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

你需要让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); } 
相关问题