函数对象:无效参数

Function object: Invalid argument

本文关键字:参数 无效 对象 函数      更新时间:2023-10-16

我是c++和STL的新手。这里有些地方我不明白:

class Foo
{
public:
    void operator()(int& bar) { std::cout << bar << std::endl; }
};
int main(int ac, char* av[])
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    std::for_each(v.begin(), v.end(), Foo); // Invalid argument Foo
    Foo foo;
    std::for_each(v.begin(), v.end(), foo); // Valid argument foo
    return 0;
}

为什么第一次尝试给出无效参数错误?非常感谢!

因为Foo是一个类(即类型),而foo是一个实例(即对象)。for_each()接受一个对象。

请记住,在c++中,类型不是一级;它们不能传递给函数等(但是,它们可以用作函数模板形参)。

因为std::for_each需要一个对象而不是一个类。Foo只是一个类型。

你的代码相当于下面的代码:

int foo;
std::for_each(v.begin(), v.end(), int); // the third parameter is incorrect, it must be "foo"

短答:

fooFoo类型的变量,但Foo是一个类型。它不能用作c++函数参数,只能用作模板参数。

长答:

c++函数接受值作为参数,而不是类型。

std::for_each不是一个c++函数,它是一个函数模板

模板是一个数学函数,以c++类型(有时是常量)作为参数。类模板是一个从类型(或常量)到类的函数。函数模板是一个从类型(或常量)到c++函数的函数。

当应用于适当的c++类型(一个迭代器类型,一个函子类型)时,std::for_each映射到一个c++函数。

这里std::for_each的模板实参是从实参列表中推导出来的:

std::for_each(v.begin(), v.end(), foo);

,因为v.begin(), v.end(), foo的类型是相同的。std::vector<int>::iterator, std::vector<int>::iterator, Foo,编译器可以推断std::for_each的模板实参

你可以显式地提供模板参数,即使它们可以被推导出来:

std::for_each<std::vector<int>::iterator, Foo> (v.begin(), v.end(), foo);

不能在需要值的地方使用类型,也不能在需要类型的地方使用值。