我已经重载了operator []以启用元素访问。
定义
double Matrix::operator[ ](const & int i){
return data[i]; // data[] is a member array: thrust:: device_vector
}
使用
Matrix m = ... // initialize
std::cout << m[3] << std::endl;
但现在我想通过索引访问元素,以便为其分配新值。
使用
m[3] = 0.;
我理解运算符重载函数的返回值必须是左值。我想我应该返回一个参考,但不知道这是怎么做的。谢谢!
修改
现在我将我的定义更改为double&amp;,但它仍然抱怨:
error: initial value of reference to non-const must be an lvalue
数组引用一个thrust :: device_vector,可以通过索引赋值:
Thrust::device_vector<double> M(10);
M[3] = 0.;
答案 0 :(得分:1)
只需替换
double ....
带
double& .....
答案 1 :(得分:0)
将您的定义更改为
double& Matrix::operator[ ](const & int i){
return data[i]; // data[] is a member array
}
答案 2 :(得分:0)
注意,不应该使用引用作为整数参数。它通常用于复杂类以避免复制。我还建议使用m_memberVariable作为旁注,除非你使用pimpl。这是你应该写的:
double& Matrix::operator[ ] (const int i) {
return m_data[i]; // data[] is a member array
}
注意,您需要添加'&amp;'标记也在声明方法的类头中。
如果您在类标题中有这样的内容,那么这就是全部:
class Matrix
{
private:
double m_data[100];
public:
double& operator[] (const int i);
};
Here您可以阅读有关下标运算符重载的更多详细信息。 This是了解更多有关参考资料的另一个网址。
至于一些内联解释为什么它的工作原理如下:
您正在尝试使用左侧的下标运算符进行赋值,因此在您正确表示它时,此类运算符重载的返回值必须是l值。这是因为如果您返回值而不是引用,则使用中的左侧将返回该值,该值将评估为x = 0
,其中x
替换为1
的值。这就是为什么在这种情况下会出现编译错误的原因。
答案 3 :(得分:0)
通常你选择拥有一对运营商。一个用于访问:
double Matrix::operator[ ] const (const & int i){
return data[i];
}
和另一个分配:
double &Matrix::operator[ ](const & int i){
return data[i];
}
如果在const对象上调用[ ] operator
,则实际调用第一个运算符。在其他情况下,无论是访问还是分配,第二个都被称为。
你得到错误:
error: initial value of reference to non-const must be an lvalue
因为data
(可能)是一个局部变量。如果它尚未成为Matrix
类私有数据成员。