我对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;
}
为什么第一次尝试会产生无效参数错误? 非常感谢你!
答案 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)
简答:
foo
是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);
您不能使用期望值的类型,也不能使用期望类型的值。