[运算符+ =应用于std :: valarray

问题描述 投票:0回答:2

这里是示例:

    #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++ pointers operator-keyword valarray
2个回答
0
投票

我最后一次涉猎C ++已经有一段时间了,所以请您在术语/细节方面有所疏漏。

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

此外,为解释为什么其他操作起作用而vi += 1无法起作用:

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

这些工作,因为(而且我不知道这是否是您要执行的操作)您已将整数放置在这些vararray字段中(new int(n)将创建一个值为n的整数),每个整数的值为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];

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

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

将起作用。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.