泛型友元运算符==重载

Generic friend operator== overload

我目前被困在一个我无法解决的问题上。我是c++世界的初学者。

对于家庭作业,我必须创建一个通用的 class 来表示分数,例如 5/6 或 11/4。 class 是通用的,它允许确定提名人和分子的类型(unsigned short、unsigned、unsigned long)。

目标是能够加、减、乘、除和比较分数。在第一阶段,我创建了一个 class 和运算符重载,允许我执行所需的所有操作,但仅限于具有相同类型的 class 实例。

现在我想改进现有代码,以便能够在不同类型的分数之间执行操作,例如:Frac<unsigned> == Frac<unsigned short>。但是重载运算符的语法有些地方我不明白。

我们以==运算符为例:

template <typename T>
bool operator==(const Frac<T>& lhs, const Frac<T>& rhs) {
  return (lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator);
}

template <typename T>
class Frac {

friend bool operator== <>(const Frac& lhs, const Frac& rhs);

private:
    T numerator, denominator;

};

这是适用于同类 Fracs 的当前版本。但现在我希望它适用于不同类型的 Fracs:

template <typename T>
class Frac;

template <typename T, typename U>
bool operator==(const Frac<T>& lhs, const Frac<U>& rhs){
return (lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator)
}

template <typename T>
class Frac {

friend bool operator== <>(const Frac& lhs, const Frac& rhs);


private:
    T numerator, denominator;

};

但是当我想比较不同类型的 Frac 时出现编译错误...我不明白也没有找到任何解决方案来具体解释问题是什么以及如何正确实施这种解决方案.

你能帮帮我吗?

我希望我的问题是清楚和完整的。

您可以通过以下方式进行操作:

template <typename T>
class Frac {

//friend declaration
template <typename S, typename U> friend
bool operator==(const Frac<S>& lhs, const Frac<U>& rhs);


private:
    T numerator, denominator;

};
template <typename T, typename U>
bool operator==(const Frac<T>& lhs, const Frac<U>& rhs){
return ((lhs.numerator == rhs.numerator) && (lhs.denominator == rhs.denominator));
}

现在您可以根据需要比较 Frac 不同类型。

我在尝试实现 operator+ 时遇到了 运行 问题。当我尝试添加两个不同类型的 Frac 时,编译器告诉我无法访问私有字段。

为了解决这个问题,我让我的 class 对自己友好,这样即使类型不同,Frac 的所有实例都可以访问其他实例的私有字段。这是正确的解决方案吗?

template <typename T>
class Frac {

//make Frac self-friend to make all instance of Frac friends each others
// not depending of Frac T type
template<typename U>
friend class Frac;

friend std::ostream& operator<< <T>(std::ostream& o, const Frac& rhs);

friend Frac operator+ <>(Frac lhs, const Frac& rhs);