2016-03-21 9 views
1

私は現在、ボックス内のガスをシミュレートするプログラムを作成しています。しかし、私はクラスオペレータの問題に出くわしました。残念なことにクラスを迷惑なものにすることはVectorと呼ばれています。非メンバ関数演算子+(...)はcv-qualifierを持つことができません

Vector.h

class Vector { 
private: 

double x; 
double y; 
double z; 

public: 

Vector & operator+=(const Vector & v){ 
    x += v.x; 
    y += v.y; 
    z += v.z; 
    return *this; 
} 

私はこの問題をより明確にするために上記のコードをedittedています。私は彼らが問題に影響しないので、コンストラクターなどを除外しました。

と.cppのため

Vector.cpp

Vector operator+(const Vector v) const{ 
Vector v2(*this); 
v2+=v; 
return v2; 
} 

そして、彼のyeildsエラー:

C:\ Users \ユーザーXXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp:95: 34:エラー:非メンバ関数 'Vector operator +(Vector)'はcv-qualifierを持つことができません

C:\ Users \ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp:関数 'Vector operator +(Vector)' :

大変助かりました。

+0

@BarryTheHatchet私はタイプミス(ちょうど宣言者がない)と解釈しました。実際には全く別の関数だとすれば、明らかにそうではありません。 – Barry

答えて

2

エラーは何が間違っているかを示します。これらの非メンバー関数を作成しましたが、メンバー関数でなければなりません。コンパイラは、あなたの(正しい)使用によって問題を検出しましたconstしかし、引数の数も欠けていて、最初のものが修正されればさらにコンパイルエラーになります。

これらの関数定義をclass Vector { ... };領域に入れるのを忘れていたか、またはの前にVector::と書くのを忘れてしまった。

+1

'演算子+'確かに**はメンバー関数ではありません。私はこの答えが混乱していることを知ります。 – SergeyA

+1

なぜ 'operator +'はメンバ関数であってはならないのですか?それは... –

+0

@ SergeyA:あなたの意見です。それは事実ではない。私は_facts_に固執しています。 –

1

メンバー関数は、const指定子を持つことができます。両方の演算子は、(署名の一部としてクラス名が存在しないため)非メンバ関数であり、クラス定義内では定義されていません。

その結果、コンパイルエラーが発生しました。あなたのVectorクラスからの宣言を削除し、それが(最も簡単なフォーム)にsigatureです変更します:あなたはフリー機能にoperator+を変換する必要があり、このエラーを修正する

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

使用する特定の理由があります異なるシグニチャを使用し、値で最初の引数を受け入れることができますが、これはあなたのレベルにとってはあまりにも深いので、今はconst参照に固執することをお勧めします。

1

他の入力をいただきありがとうございます。どちらもメリットがあります。私はBarry @ BarryTheHatchetによって与えられた答えに基づいて私自身の答えを見つけました。その他の情報源私は私を与え、公共のセクションのヘッダファイル内の定義を移動し、この問題を解決するために :

Vector & operator+=(const Vector & v){ 
    x += v.x; 
    y += v.y; 
    z += v.z; 
    return *this; 
} 

Vector operator+(const Vector v) const { 
    Vector VecPlus(*this); 
    VecPlus.x += v.x; 
    VecPlus.y += v.y; 
    VecPlus.z += v.z; 
    return VecPlus; 
} 

これは結果であった、私はそれが合法的にそれをコーディングする方法はないshody方法にあると思いますか後で問題につながるだろう。私は自分のプロジェクトを進めてきました。

+0

2番目の関数では、引数を'const'以外にすると 'v'を直接操作し、現在は余分なコピーである' VecPlus'を作成することはできません。 –

関連する問題