代码之家  ›  专栏  ›  技术社区  ›  DaClown

函数参数类型不完整?

  •  1
  • DaClown  · 技术社区  · 16 年前

    我有一个模板类,它使用一个策略作为输出,另一个模板参数来确定它的数据成员的类型。此外,构造函数接受指向存储在私有指针中的基类的指针。此对象的函数应使用指向模板类的此指针,以允许它们访问数据。在代码中,如下所示:

    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: 好吧,我想我对这个“设计”有点乐观。如果能加些吃的东西,喝点汤就好了。但是现在盐必须知道锅里的水的种类。我将把模板改为简单的旧合成。谢谢你们。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Janick Bernet    16 年前

    如果你想使用 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; 
    
        2
  •  1
  •   sje397    16 年前

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