【发布时间】:2022-01-05 18:39:04
【问题描述】:
我目前遇到了一个我无法解决的问题。我是 C++ 世界的初学者。
对于家庭作业,我必须创建一个通用类来表示像 5/6 或 11/4 这样的分数。这个类是通用的,它允许确定提名者和分子的类型(无符号短、无符号、无符号长)。
目标是能够加、减、乘、除和比较分数。在第一阶段,我创建了一个类和运算符重载,允许我做所有需要的事情,但仅限于具有相同类型的类的实例。
现在我想改进现有代码,使其能够在不同类型的部分之间执行操作,例如: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;
};
这是适用于相同类型 Frac 的当前版本。但现在我希望它适用于不同类型的 Frac:
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 时出现编译错误......我不明白,也没有找到任何解决方案具体解释问题是什么以及如何正确实施这种解决方案。
你能帮帮我吗?
我希望我的问题清晰完整。
【问题讨论】:
-
我会警告您通常不希望发生这种情况。这听起来像是一个伟大的想法,但我可以想到一堆我要验证的极端案例(然后我会担心我错过的所有极端案例)。我会说最好只比较相同类型的对象,并强制用户在比较之前将对象转换为相同类型。
-
感谢您的建议,这只是一个学术项目。目标是了解类的通用性和基础。但我下次记住它。
标签: c++ operator-overloading friend