运算符 += 应用于 std::valarray<int*>

Operator += applied to std::valarray<int*>

示例如下:

    #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;
    }

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

有解决办法吗?

此致,

我最近一次接触 C++ 已经有一段时间了,所以请原谅 terminology/details 方面的任何失误。

你的错误归结为 += 对 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]中,这本来是[=23] =]

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

问题是 per documentationvi[0][0] = 0 等...如果这些字段尚不存在,则只是提示 valarray 创建这些字段,所以当然

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

会起作用。

您可以看到 valarray hereoperator+ 重载。如您所见,没有重载适合您要执行的操作(添加 int 和指针)。

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

vi.apply([](int * p){ return p + 1; });