0

わかりました、私はこのエラーを理解しようとしていますが、これまでのところ、まったく運がありません. 私は宿題のためにこれを行っているので、含まれているクラスを使用していません。

関連するコードは次のとおりです。

//Will return an array where each element is the sum of the respective sums in the added         arrays
Vec& Vec::operator+(Vec& v2) const{
    Vec ret();
    if(mySize>0){
        Vec ret(mySize);
        for(unsigned i = 0;i<mySize;i++){
            ret[i]=v2[i]+myArray[i];
        }
    }
    else{
    }
    return ret;
}

そして、.h ファイルから...:

Vec& operator+ (Vec& v2) const;

これにより、エラーがスローされます:「タイプ 'Vec (*)()' の右辺値からのタイプ 'Vec&' の非定数参照の無効な初期化」

4

3 に答える 3

7
Vec ret();

引数を取らずにを返す関数の前方宣言と見なされますVec。参照:最も厄介な解析。

次に、ローカル変数への参照を返しますが、これは悪いことです。ret関数が戻るとすぐにスコープから外れます。

于 2012-10-01T19:22:27.130 に答える
3

Vec実際のエラーは、オブジェクトを宣言する代わりに、演算子内で関数を宣言していることです。

Vec ret();

を省略することで修正できます()

Vec ret;

それに加えて、演算子のスコープに対してローカルな変数への参照を返そうとしているため、ダングリング参照が発生するという基本的な設計エラーがあります。加算演算子を表現する通常の方法は、新しいオブジェクトを返すようにすることであり、通常、次のようなシグネチャを持つ非メンバー関数として実装されます。

Vec operator+(const Vec& lhs, const Vec& rhs);

これは、インクリメント メンバー演算子の観点から実装できます。

Vec& operator+=(const Vec& rhs);

これはへの参照を返すことができるthisため、ダングリング参照はありません。od の実装例は次のoperator+ようになります。

Vec operator+(Vec lhs, const Vec& rhs)
{
    return lhs += rhs;
}
于 2012-10-01T19:22:17.340 に答える
0

ret他の人が述べているように、デフォルトで a を構築していると思われる最初の宣言は、Vec実際には引数をとらず、 a を返す関数を前方宣言していますVec。別名、最も厄介な parse

また、if ステートメント内の 'ret' の変数シャドウイングは、返されることを期待している変数を変更していないことを意味します。次のようなものが必要になる可能性があります。

Vec Vec::operator+(const Vec& v2) const{
    Vec ret(mySize);
    if(mySize>0){
        for(unsigned i = 0;i<mySize;i++){
            ret[i]=v2[i]+myArray[i];
        }
    }
    else{
    }
    return ret;
}
于 2012-10-01T19:37:53.883 に答える