函数对象:无效参数
Function object: Invalid argument
我是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"
短答:
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);
不能在需要值的地方使用类型,也不能在需要类型的地方使用值。
- std::cin >>上的参数无效
- 结果失败或多个参数无效
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- 错误 带有模块的一元"*"(具有"int")的类型参数无效
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- MPI_Iprobe:RMA 调用中的位移参数无效
- 推力::sort_by_key上的配置参数无效
- windres 致命错误:将输出写入时:参数无效
- 一元'*'的类型参数无效(有双精度)
- C++:传递给 C 运行时函数的参数无效
- 矢量模板参数无效
- 写入 -: 参数无效 } 时出错
- winsock2:recvfrom()函数以错误10022(参数无效)结束
- 模板参数的显式指定参数无效,该参数是 constexpr
- 模板参数无效
- 调用 getter 成员时的参数无效
- 模板模板参数中的参数无效
- 方法调用中的参数无效
- POSIX 计时器:参数无效
- C++类模板是一个模板:模板参数无效