首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数参数不完全类型?

函数参数不完全类型?
EN

Stack Overflow用户
提问于 2010-07-09 15:44:27
回答 2查看 745关注 0票数 1

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

代码语言:javascript
运行
复制
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是一个接口,应该实现。看起来是这样的:

代码语言:javascript
运行
复制
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,我想我对这个“设计”有点乐观。只要加些配料,喝点汤就好了。但是现在盐必须知道锅里的水的种类。我将把模板更改为普通的旧组合。谢谢你们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-09 15:55:54

如果您想使用带有“空闲”模板参数的ModelCreator,那么您也必须让ShapeGenerator成为一个模板:

代码语言:javascript
运行
复制
template <typename PointData, typename OutputPolicy> 
class ShapeGenerator {
public:
    void generateShape (ModelCreator<PointData,OutputPolicy>* m) = 0;
};

代码语言:javascript
运行
复制
template <template <typename, typename> class ModelCreator> 
class ShapeGenerator {
public:
    void generateShape (ModelCreator* m) = 0;
};

第二个版本接受另一个模板作为参数。你会像这样使用它:

代码语言:javascript
运行
复制
ShapeGenerator<ModelCreator<PointDataType,OutPutPolicyType> > shapeGenerator; 
票数 3
EN

Stack Overflow用户

发布于 2010-07-09 15:57:01

您还需要使ShapeGenerate成为一个模板类:

代码语言:javascript
运行
复制
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); }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3214250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档