-4

我已经重载了运算符 [ ] 以启用元素访问。

定义

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 &,但它仍然抱怨:

 error: initial value of reference to non-const must be an lvalue

数组引用一个thrust::device_vector,可以通过索引赋值:

Thrust::device_vector<double> M(10);
M[3] = 0.;
4

4 回答 4

1

只需更换

double ....

double& .....

于 2013-09-06T05:46:01.340 回答
0

将您的定义更改为

double& Matrix::operator[ ](const & int i){
     return data[i]; // data[] is a member array
}
于 2013-09-06T05:47:45.037 回答
0

请注意,您不应将引用用于整数参数。它通常用于复杂的类以避免复制。作为旁注,我还建议使用 m_memberVariable,除非您使用 pimpl。这是你应该写的:

double& Matrix::operator[ ] (const int i) {
     return m_data[i]; // data[] is a member array
}

请注意,您还需要在声明方法的类头中添加“&”标记。

这一切都提供了你在类头中有这样的东西:

class Matrix
{
private:
    double m_data[100];

public:
    double& operator[] (const int i);
};

在这里,您可以阅读有关下标运算符重载的更多详细信息。是另一个了解更多参考资料的网址。

至于为什么它会这样工作的一些内联解释:

您正在尝试使用左侧的下标运算符进行赋值,因此这种运算符重载的返回值必须是您正确声明的左值。这是因为如果您返回一个值而不是引用,则使用中的左侧将简单地返回该值,该值将评估为x = 0where 替换x为类似的值1。这就是为什么在这种情况下会出现编译器错误的原因。

于 2013-09-06T06:10:27.217 回答
0

通常你选择有一对运算符。一个用于访问:

double Matrix::operator[ ] const (const & int i){
     return data[i]; 
}

另一个用于分配:

double &Matrix::operator[ ](const & int i){
     return data[i]; 
}

如果您调用[ ] operatorconst 对象,则真正调用第一个运算符。在其他情况下,无论是在访问还是分配中,都会调用第二个。

你得到错误:

 error: initial value of reference to non-const must be an lvalue

因为data(可能)是一个局部变量。Matrix如果还没有,请将其设为类私有数据成员。

于 2013-09-06T06:21:39.560 回答