函数对象:参数无效

时间:2013-06-18 12:02:44

标签: c++ stl

我对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;
}

为什么第一次尝试会产生无效参数错误? 非常感谢你!

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

您的代码与此代码相同:

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

答案 2 :(得分:1)

简答:

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>::iteratorstd::vector<int>::iteratorFoo,编译器可以推断std::for_each的模板参数。

即使可以推断出模板参数,也可以明确提供模板参数:

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

您不能使用期望值的类型,也不能使用期望类型的值。