0

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

为什么第一次尝试会给出 Invalid Argument 错误?非常感谢!

4

3 回答 3

5

因为Foo是类(即类型),而是foo实例(即对象)。 for_each()需要一个对象来处理。

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

于 2013-06-18T12:03:38.670 回答
2

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

您的代码与此代码等效:

int foo;
std::for_each(v.begin(), v.end(), int); // the third parameter is incorrect, it must be "foo"
于 2013-06-18T12:05:30.650 回答
1

简短的回答:

foo是 type 的一个变量Foo,但是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);

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

于 2013-06-18T12:14:04.173 回答