gpt4 book ai didi

c++ - 如何为 valarray 类重载非常量索引运算符

转载 作者:行者123 更新时间:2023-11-28 07:34:30 24 4
gpt4 key购买 nike

在下面的类中,当我尝试为 operator [] 返回 std::valarray& 时,它说:invalid initialization of std::valarray& from R - 值引用 std::valarray

我是这样使用它的:

int main()
{
Matrix<int> MM(4, 4);
for (int I = 0, K = 0; I < 4; ++I)
{
for (int J = 0; J < 4; ++J)
{
MM[I][J] = K++; //Assigning to it does nothing atm :S
}
}

for (int I = 0; I < 4; ++I)
{
for (int J = 0; J < 4; ++J)
{
std::cout<<MM[I][J]<<" "; //Prints random values :l
}
std::cout<<"\n";
}
}

类如下:

template<typename T>
class Matrix
{
private:
int Width, Height;
std::valarray<T> Elements;
static_assert(std::is_arithmetic<T>::value, "Argument T must be of arithmetic type.");

public:
Matrix(int Width, int Height);
Matrix(T* Data, int Width, int Height);
Matrix(T** Data, int Width, int Height);


std::valarray<T>& operator [](int Index);
const std::valarray<T>& operator [](int Index) const;
};

template<typename T>
Matrix<T>::Matrix(int Width, int Height) : Width(Width), Height(Height), Elements(Width * Height, 0) {}

template<typename T>
Matrix<T>::Matrix(T* Data, int Width, int Height) : Width(Width), Height(Height), Elements(Width * Height)
{
std::copy(Data, Data + (Width * Height), &Elements[0]);
}

template<typename T>
Matrix<T>::Matrix(T** Data, int Width, int Height) : Width(Width), Height(Height), Elements(Width * Height)
{
std::copy(Data[0], Data[0] + (Width * Height), &Elements[0]);
}


//ERROR below..
template<typename T>
std::valarray<T>& Matrix<T>::operator [](int Index)
{
return Elements[std::slice(Index * Width, Width, 1)];
}

template<typename T>
const std::valarray<T>& Matrix<T>::operator [](int Index) const
{
return Elements[std::slice(Index * Width, Width, 1)];
}

所以我的问题是.. 我如何重载 [] 运算符以便我可以获得单个行或列以便我可以对其进行索引并分配给它?我不想使用 () 下标运算符

最佳答案

在非const operator[]你有,这个表达

return Elements[std::slice(Index * Width, Width, 1)];

这会创建一个 std::slice_array<T>对象,它是一个右值。您不能将此绑定(bind)到 std::valarray<T>& .可以通过更改函数以返回 valarray 来修复错误。按值而不是按引用。

template<typename T>
std::valarray<T> Matrix<T>::operator [](int Index) // <-- return by value
{
return Elements[std::slice(Index * Width, Width, 1)];
}

关于c++ - 如何为 valarray 类重载非常量索引运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17006225/

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