繁体   English   中英

运算符 += 应用于 std::valarray<int*></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;
    }

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

有解决方法吗?

此致,

您可以在此处查看valarrayoperator+重载。 如您所见,没有重载适合您尝试做的事情(添加一个int和一个指针)。

std::valarray没有异构二进制操作的重载,但它确实具有其他函数的全部功能, apply

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

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

您的错误归结为 valarray 上的+=尝试对 valarray 的每个元素执行操作。 默认情况下(如果我的 memory 没有欺骗我),integer 指针没有+操作,这些指针存储在您的 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;

假设您试图将 integer 数组存储在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;

将工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM