在下面的代码片段中,我不知道为什么我在执行时会收到类似“无效使用void表达式”的错误 功能对象与向量。虽然它在矢量外有效。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class AddVal {
int i;
public:
AddVal (int a) : i(a) {}
void operator()(int val) {
cout << i + val << endl;
}
void operator()(string obj) {
cout << "string obj" << obj;
}
};
int main() {
vector<int> vec = { 1, 2, 3 };
vector<string> vecs = { "mo", "han", "raj" };
int x = 2;
AddVal(2)("john"); // valid
AddVal(1)(2); // valid
//for_each(vecs.begin(), vecs.end(), AddVal(2)("john")); // not valid
for_each(vec.begin(), vec.end(), AddVal(x)); // valid
// not valid in vector (invalid use of void expression)
//for_each(vec.begin(), vec.end(), AddVal(1)(x));
return 1;
}
答案 0 :(得分:0)
看看for_each实际期望输入的内容:http://www.cplusplus.com/reference/algorithm/for_each/
作为要在函数指针或函子中发送的第三个参数。在您的无效案例中,您发送的返回值为void AddVal::operator()(int)
或void AddVal::operator()(string)
(无效)。
在有效的情况下,您发送的是AddVal类的对象,即函数对象。
答案 1 :(得分:0)
AddVal(1)
的结果是一个对象 - 你正在调用构造函数。
这个对象有一个(好的,两个)operator ()
成员函数;一个拿一个int,另一个拿一个字符串。
AddVal(1)(2)
是在对象operator ()(int)
上调用AddVal(1)
的结果,
并且由于AddVal::operator()(int)
返回void,这是AddVal(1)(2)
的类型。