在向量中无效使用void表达式错误

时间:2013-12-11 22:49:26

标签: c++ vector stl functor

在下面的代码片段中,我不知道为什么我在执行时会收到类似“无效使用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;
}

2 个答案:

答案 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)的类型。