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实现文件中的数据成员,因为a它被声明为私有数据成员,即使它是通过X对象?

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 引用。

于 2013-09-05T21:50:30.833 回答
9

您已经声明了一个与您尝试使用的不同的友元函数。你需要

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

无论如何,比较运算符采用非常量引用是没有意义的。

于 2013-09-05T21:50:13.690 回答