6

次のように、クラスの小なり演算子をオーバーロードしています。

#include<string>
using namespace std;

class X{
public:
    X(long a, string b, int c);
    friend bool operator< (X& a, X& b);

private:
    long a;
    string b;
    int c;
};

そして実装ファイル:

#include "X.h"


bool operator < (X const& lhs, X const& rhs)
{
    return lhs.a< rhs.a;
}

ただし、オブジェクトを介していても、プライベートデータメンバーとして宣言されているaため、実装ファイルのデータメンバーにアクセスできませんか?aX

4

2 に答える 2

17

フレンド関数は、関数で定義された関数と同じシグネチャを持っていません:

friend bool operator< (X& a, X& b);

bool operator < (X const& lhs, X const& rhs)
//                 ^^^^^         ^^^^^

ヘッダー ファイルの行を次のように変更するだけです。

friend bool operator< ( X const& a, X const& b);
//                        ^^^^^       ^^^^^

比較演算子内のオブジェクトを変更しないため、const-reference を使用する必要があります。

于 2013-09-05T21:50:30.833 に答える
9

使用しようとしているものとは異なるフレンド関数を宣言しました。あなたが必要

friend bool operator< (const X& a, const X& b);
//                     ^^^^^       ^^^^^

いずれにせよ、比較演算子が非 const 参照を取ることは意味がありません。

于 2013-09-05T21:50:13.690 に答える