gpt4 book ai didi

c++ - 'sum' 中没有名为 'std::slice_array' 的成员

转载 作者:行者123 更新时间:2023-11-28 04:06:15 25 4
gpt4 key购买 nike

这里有一个代码不能用至少符合 c+++11 的编译器编译(在 godbolt 上试过):

#include <valarray>
#include <vector>
#include <iostream>

class Whatever {
public:
int sliceSum(const std::vector<int>& nums, int k) const {
std::valarray<int> data(nums.size());
for (int i = 0; i < nums.size(); ++i) {
data[i] = nums[i];
}
// Here we have St11slice_arrayIiE
std::cout << typeid(decltype(data[std::slice(0, k, 1)])).name() << std::endl;
return data[std::slice(0, k, 1)].sum();
}
};

class Matrix {
std::valarray<int> data;
int dim;
public:
Matrix(int r, int c) : data(r*c), dim(c) {}
int& operator()(int r, int c) {return data[r*dim + c];}
int trace() const {
// Here we have St5_ExprISt6_SClosISt9_ValArrayiEiE
std::cout << typeid(decltype(data[std::slice(0, dim, 1)])).name() << std::endl;
return data[std::slice(0, dim, 1)].sum();
}
};
int main()
{
Matrix m(3,3);
int n = 0;
for(int r=0; r<3; ++r)
for(int c=0; c<3; ++c)
m(r, c) = ++n;
Whatever s;
s.sliceSum({1,2,3}, 3);
m.trace();
}

Matrix 取自 https://en.cppreference.com/w/cpp/numeric/valarray/slice 和类 Whatever 是我的。

所以我不明白问题是什么以及为什么在两个相同(?)的情况下类型不同。

最佳答案

那是因为在 Matrix 情况下 dataconst(因为方法是 constdata 是成员),而在 Whatever 情况下 data 不是 const(因为它在方法本身)。

如果您查看 operator[] declarations对于 std::valarray,您会看到它有两个接受切片参数的 operator[],一个 const 和一个不接受 常量.

const 版本返回 std::valarray,它有一个 sum 方法,non-const返回 std::slice_array,但不返回。

要解决此问题,请将结果包装在 std::valarray 中:

return std::valarray(data[std::slice(0, k, 1)]).sum();

关于c++ - 'sum' 中没有名为 'std::slice_array<int>' 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58679271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com