【问题标题】:invalid use of void expression error in vector在向量中无效使用 void 表达式错误
【发布时间】:2013-12-11 22:49:26
【问题描述】:

在下面的代码 sn-p 中,我不确定为什么在执行时会出现“无效使用 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;
}

【问题讨论】:

  • 您对for_each(vec.begin(), vec.end(), AddVal(1)(x)); 有什么期望?根据AddVal::operator()的类型,AddVal(1)(x)返回的void不能用于表达式。
  • 可疑行最终会调用void operator ()( int val),结果为void,并且不适用于上下文。你的意思是使用返回类型和return i + val; 而不是cout????
  • 它只是将向量元素与 2 相加。我的问题是没有向量它不会闪现错误但使用向量我会收到此错误。我希望它有所帮助。

标签: c++ vector stl functor


【解决方案1】:

看看 for_each 实际期望的输入:http://www.cplusplus.com/reference/algorithm/for_each/

作为第三个参数,您要发送函数指针或函子。在您的 invalid 情况下,您发送的返回值是 void AddVal::operator()(int)void AddVal::operator()(string)(无效)。

在您的 valid 情况下,您发送的是 AddVal 类的对象,即函数对象。

【讨论】:

  • AddVal(1)(x) 有效,但在 for_each 中无效。那是我的问题。函子已被用作第三个参数。
【解决方案2】:

AddVal(1) 的结果是一个对象——你正在调用构造函数。

这个对象有一个(嗯,两个)operator () 成员函数;一个取一个 int,另一个取一个字符串。

AddVal(1)(2) 是在对象AddVal(1) 上调用operator ()(int) 的结果, 并且由于AddVal::operator()(int)返回void,这就是AddVal(1)(2)的类型。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2016-07-12
    相关资源
    最近更新 更多