-1

A の「+」演算子をオーバーロードしたいのstructですが、コンパイラの警告が表示されます。これが私の試みです:

struct wektor{
    int x;
    int y=0;    
    int norm(){
        return x*x+y*y;
    }
};

wektor& operator +(wektor &a,wektor &b){
    wektor c;
    c.x=a.x+b.x;  // 12 line - warning here
    c.y=a.y+b.y;
    return c;
};

コンパイラ警告:

[警告] 非静的データ メンバー初期化子は、12 行の -std=c++11 または -std=gnu++11 [デフォルトで有効] でのみ使用可能

4

4 に答える 4

8

警告は、次の行について伝えています。

int y=0;

C++11 より前の非静的非定数メンバーに初期化子を設定することはできません。0に初期化yする場合は、コンストラクターにwektorメンバー初期化リストを指定する必要があります。

それにもかかわらず、operator+パラメータは type である必要がありますconst wektor&。現時点では、関数の最後で破棄されるローカル オブジェクトへの参照を返しているため、値によっても返される必要があります。これは悪いことです。次のようになります。

wektor operator +(const wektor &a, const wektor &b){
    wektor c;
    c.x=a.x+b.x;  // 12 line - warning here
    c.y=a.y+b.y;
    return c;
};
于 2013-03-05T23:24:30.210 に答える
4

まず、二項演算子 + は、参照ではなく新しい値を返す必要があります。また、入力としての参照に関して実装されている場合、これらは const である必要があります。

wektor operator +(const wektor &a, const wektor &b);

次に、警告はこの初期化に関するものです。

struct wektor{
    int x;
    int y=0;    // HERE! C++11 only
    int norm(){
        return x*x+y*y;
    }
};

これは C++11 でのみ実行できます。C++03 ではコンストラクターを使用できます。

struct wektor{
    wector() : y() {} // zero-initializes y
    int x;
    int y;
    int norm(){ return x*x+y*y;}
};

に戻るとoperator+、 member を実装してoperator+=から、それを非 member で使用しますoperator+

wektor operator +(wektor a, const wektor &b)
{
  return a+= b;
}

または、 とwectorに 2 つのパラメーターのコンストラクターを指定しxますy

wector(int x, int y) : x(x), y(y) {}

アリその後

wektor operator + (const wektor& a, const wektor &b)
{
  return wector(a.x + b.x, a.y + b.y);
}
于 2013-03-05T23:24:58.670 に答える
2

そうではない。署名は

wektor operator +(const wektor &a, const wektor &b)

つまり、演算子からの参照によって+返さないでください。さらに重要なのは、参照によって一時的なものを返さないことです。

于 2013-03-05T23:24:33.183 に答える
1

これは、以前の C++ 標準では使用できない C++11 の機能を使用しているという警告です。

プログラミングしたものが思いどおりに動作することがわかっている場合は、次のようにしてこのエラーを取り除くことができます。

CodeBlocks を使用している場合:

  1. 「ビルドオプション...」を右クリック
  2. 「その他のオプション」タブを選択します
  3. 「-std=gnu++11」を追加

コマンド ラインを使用している場合: コマンド引数に「-std=gnu++11」を追加します。

于 2013-03-05T23:34:52.957 に答える