2011-02-18 11 views
2

可能性の重複:
What does “operator = must be a non-static member” mean? (C++)C++グローバルオーバーロードされた演算子=

こんにちは、

私は、次のコードを持っている...

// Header file 
    struct dataRecord{ 
    size_t id; 
    char name[gcNameLength]; 
    }; 

    void operator=(dataRecord &adr, const dataRecord &bdr); 

どのようにこれまでのgcc私にフォローを与えるコンパイル時にエラーが発生する。

error: ‘void operator=(dataRecord&, const dataRecord&)’ must be a nonstatic member function 

ありがとうございました。

+0

「非静的メンバ関数である必要があります:あなたは演算子=をオーバーロードするとき、それは流れを中断されませんなどexpressiosができるようになりますので、あなたは、左のオペランドへの参照を返すこと

は注意" - ここではっきりしないことは何ですか? –

+0

この場合、エラーメッセージは非常に正確に問題を伝えています: 'operator ='をオーバーロードしようとするとグローバル関数として実行できません - 非静的メンバ関数グローバルを使用する通常の理由は、左オペランドの変換を許可することですが、それは割り当ての場合は適用されません)。 –

+0

したがって、構造体の一部でなければなりませんグローバルにすることはできません。 – Thomas

答えて

5

struct dataRecord自体で=の操作をオーバーロードする必要があります。以下のような

何か:

struct dataRecord{ 
    size_t id; 
    char name[gcNameLength]; 
    dataRecord& operator= (const dataRecord&) { 
     // write overload code here 
    } 
}; 
+0

注:参考までに返信してください。 –

+0

@Martin:ありがとう!これを修正しました。 –

2

演算子=の関数のようなものがありません。演算子は、クラスまたは構造体のメンバーでなければなりません。その関数の引数はrvalueとして扱われます。メンバー関数を持つオブジェクトは左辺値です。

2

What does “operator = must be a non-static member” mean?で述べたように、演算子のオーバーロードはメンバ関数である必要があります。

dataRecord r1; 
dataRecord r2; 
... 
dataRecord r3 = r2 = r1; 
+0

良い仕事は詐欺を見つける –

+0

私はoperator =からvoidを返すことは気にしない。特にコピーが高価な場合。私は、一般的な予想される行動は参照を返すことであることを知っていますが、これは使用コストに対して測定されなければなりません。 –

+0

参照を返すのは高価ではありません。関数がインラインの場合、ほとんどのコンパイラは最適化して自由になります。 – fbafelipe

関連する問題