-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

整数引数に参照を使用しないでください。通常、コピーを避けるために複雑なクラスに使用されます。pimplを使用しない限り、m_memberVariableを使用することもお勧めします。これはあなたが書くべきものです:

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);
};

ここでは、添え字演算子のオーバーロードに関する詳細を読むことができます。これは、参照について詳しく学ぶための別の URL です。

なぜそれがそのように機能するのか、インラインの説明については次のとおりです。

代入のために左側の添字演算子を使用しようとしているため、そのような演算子のオーバーロードの戻り値は、正しく記述した左辺値でなければなりません。これは、参照の代わりに値を返す場合、使用法の左側は単純にその値を返し、その値がのような値x = 0に置き換えられるためです。そのため、このような場合にコンパイラ エラーが発生します。x1

于 2013-09-06T06:10:27.217 に答える
0

通常、オペレーターのペアを選択します。アクセス用の 1 つ:

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

もう1つは割り当て用です。

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

const オブジェクトを呼び出す[ ] operatorと、最初の演算子が実際に呼び出されます。それ以外の場合は、アクセスと代入の両方で、2 番目のものが呼び出されます。

エラーが発生します:

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

data(おそらく)ローカル変数だからです。Matrixまだ作成されていない場合は、クラスのプライベート データ メンバーにします。

于 2013-09-06T06:21:39.560 に答える