我必须使用'生成'在向量上运行以创建10个对象。我有一个带有构造函数的类:
Point(){
this->x=rand()%100;
this->y=rand()%100;
};
然后我创建一个向量并使用' generate'功能:
vector<Point> v (10);
generate (v.begin(), v.end(), Point());
当我编译它时,我收到此错误:
Type 'Point' does not provide a call operator
我不知道为什么。
答案 0 :(得分:3)
看起来你想用Point
的默认构造实例填充向量。
在回答您的实际问题之前,调用std::generate
是不必要的,因为v
已经有10个默认构造的Point
实例。
但是如果你真的想要调用它,std::generate
期望Generator
为一个函数对象,即一个operator()
的对象。 Point
没有,编译器会抱怨。传递lambda是个好主意,因为它们是这样的函数对象:
std::generate(v.begin(), v.end(), []() {
return Point{};
});
答案 1 :(得分:2)
生成器函数的原型描述为here。它必须是一个返回下一个要生成的值的函数。您正在传递Point
的单个默认构造实例。也许你试图提供Point
的构造函数作为生成器函数,但是构造函数不符合要求(它不会返回任何东西),永远不应该直接调用它,&#&#&# 39;永远无法获得地址(你也不能得到一个地址)。
您必须提供一个单独返回点的函数。最简单的方法是传递std::generate
lambda函数。你会做这样的事情:
std::vector<Point> v(10);
std::generate(v.begin(), v.end(), []() { return Point{}; });
但请注意,行std::vector<Point> v(10);
已经创建了10个默认构造的Point
个对象。由于您的随机化逻辑在您的默认构造函数中,因此在这种情况下使用std::generate
是多余的。
答案 2 :(得分:0)
你需要一个生成积分的功能
Point RandomPoint() { return Point(); }
int main(int argA, char** argV)
{
vector<Point> v(10);
generate(v.begin(), v.end(), RandomPoint);
return 0;
}