重载运算符时无法访问的类成员

Inaccessible class members while overloading operators

本文关键字:成员 访问 运算符 重载      更新时间:2023-10-16

我有这样的类:

class Fraction{
    friend Fraction operator+(Fraction& f1, Fraction& f2);
    friend Fraction operator-(Fraction& f1, Fraction& f2);
    friend Fraction operator*(Fraction& f1, Fraction& f2);
    friend Fraction operator/(Fraction& f1, Fraction& f2);
    friend istream& operator>>(istream& cin, Fraction& f);
private:
    int num;
    int den;
};

和运算符过载:

istream& operator>>(istream& cin, Fraction& f)
{
    char ch;
    cin >> f.num >> ch >> f.den;
    return cin;
}

Visual Studio告诉我f.num和f.den无法访问。知道为什么吗?

friend istream& ::operator>>(istream& cin, Fraction& f);

add :: 在运算符之前,它标记放置在全局命名空间的函数运算符>>()

UPD:另一种解决方案是在类和函数之前添加函数和类的预定义:

class Fraction;
std::istream& operator>>(std::istream& cin, Fraction& f);

当然,不要忘记 std:: 前缀是接口 (.h/.hpp) 所必需的。但是使用命名空间标准;如果仅用于实施 (.cpp)