运算符 += 应用于 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 documentation、vi[0][0] = 0
等...如果这些字段尚不存在,则只是提示 valarray 创建这些字段,所以当然
std::cout << vi[0][0] << std::endl;
std::cout << vi[1][0] << std::endl;
会起作用。
您可以看到 valarray
here 的 operator+
重载。如您所见,没有重载适合您要执行的操作(添加 int
和指针)。
std::valarray
没有异构二进制操作的重载,但它确实有其他功能的包罗万象,apply
.
vi.apply([](int * p){ return p + 1; });
示例如下:
#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 documentation、vi[0][0] = 0
等...如果这些字段尚不存在,则只是提示 valarray 创建这些字段,所以当然
std::cout << vi[0][0] << std::endl;
std::cout << vi[1][0] << std::endl;
会起作用。
您可以看到 valarray
here 的 operator+
重载。如您所见,没有重载适合您要执行的操作(添加 int
和指针)。
std::valarray
没有异构二进制操作的重载,但它确实有其他功能的包罗万象,apply
.
vi.apply([](int * p){ return p + 1; });