0

这是示例:

    #include <iostream>
    #include <string>
    #include <valarray>

    int main()
    {
      std::valarray<std::string> vs(2);
      // vs[0] += "hello"; // works
      // vs[1] += "hello"; // works
      vs += "hello"; // works
      std::cout << vs[0] << std::endl;
      std::cout << vs[1] << std::endl;

      std::valarray<int*> vi(2);
      vi[0] = new int[2];
      vi[0][0] = 0;
      vi[0][1] = 1;
      vi[1] = new int[2];
      vi[1][0] = 2;
      vi[1][1] = 3;
      std::cout << vi[0][0] << std::endl;
      std::cout << vi[1][0] << std::endl;
      // vi[0] += 1; // works
      // vi[1] += 1; // works
      vi += 1; // error: invalid operands of types 'int*' and 'int*' to binary 'operator+'
      std::cout << vi[0][0] << std::endl;
      std::cout << vi[1][0] << std::endl;
    }

我不明白这个错误,如果有人可以向我解释。

有解决方法吗?

此致,

4

3 回答 3

1

std::valarray对异构二进制操作没有重载,但它确实对其他函数有包罗万象,apply.

vi.apply([](int * p){ return p + 1; });
于 2020-06-09T12:37:27.877 回答
1

你可以在这里看到operator+重载。如您所见,没有重载适合您尝试做的事情(添加一个和一个指针)。valarray int

于 2020-06-09T10:11:00.500 回答
0

我最后一次涉足 C++ 已经有一段时间了,所以请原谅在术语/细节方面的任何失误。

您的错误归结为+=在 valarray 上尝试对 valarray 的每个元素执行操作。默认情况下(如果我的记忆没有欺骗我),+整数指针没有任何操作,它们存储在你的 valarray 中。您需要+首先为 int 指针指定一个重写的运算符。

另外,为了解释为什么其他操作有效而vi += 1无效:

 vi[0] += 1; // works
 vi[1] += 1; // works

这些工作,因为(我不知道这是否是你打算做的)你已经在这些 vararray 字段中放置了整数(new int(n)将创建一个值为 n 的 int),每个值为 2。所以 vi[ 0] 是 2,vi[0] 也是如此。你也可以写

vi[0] = 2;
vi[1] = 2;

假设您试图在vi[0]/中存储一个整数数组vi[1],这本来是

vi[0] = new int[2];
vi[1] = new int[2];

问题是每个文档vi[0][0] = 0等等......如果它们不存在,只需提示 valarray 创建这些字段,所以当然

std::cout << vi[0][0] << std::endl;
std::cout << vi[1][0] << std::endl;

将工作。

于 2020-06-09T10:10:46.950 回答