![](/img/trans.png)
[英]Why the capturing lambda cannot be applied to the std::valarray?
[英]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;
}
我不明白这个错误,如果有人可以向我解释。
有解决方法吗?
此致,
您可以在此处查看valarray
的operator+
重载。 如您所见,没有重载适合您尝试做的事情(添加一个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.