类模板的算术运算符重载,运算符应采用两个不同类型的类

Dav*_*ave 2 c++ operator-overloading class-template c++17

我正在为分数创建模板类,分子和分母的类型可以是int,float或double。当重载算术或关系运算符时,当我尝试添加两个类(例如A类和B类)时,它会给出错误

在头文件“ fraction.h”中

#include<iostream>
using namespace std;

template <class T>
class fraction
{
friend ostream& operator<< <T>(ostream&, const fraction<T>&);
public:
fraction();
fraction<T>(T, T);
friend fraction<T> operator+(const fraction<T>&, const fraction<T>&);
private:
    T numerator;
    T denominator;
};

template <class T>
fraction<T>::fraction()
{
    numerator = 0;
    denominator = 1;
}

template <class T>
fraction<T>::fraction(T num, T denom)
{
    numerator = num;
    denominator = denom;
}
template <class T>
ostream& operator<<(ostream& osObject, const fraction<T>& frac)
{
osObject << frac.numerator << "/" << frac.denominator;
return osObject;
}

template <class T>
fraction<T> operator+(const fraction<T>& fraction1, const fraction<T>&     fraction2)
{
fraction<T> temp;
temp.numerator = fraction1.numerator * fraction2.denominator + fraction1.denominator * fraction2.numerator;
temp.denominator = fraction1.denominator * fraction2.denominator;

return temp;
}
Run Code Online (Sandbox Code Playgroud)

并在cpp文件中

#include"fraction.h"

int main()
{
    fraction<int> num1(5,6);
    fraction<double> num2(5.1,6.1);
    fraction<double> num3();

    cout << num1+num2; 
}
Run Code Online (Sandbox Code Playgroud)

我希望它显示10.1 / 12.1,但相反,它会给出表示二进制'+'的编译器错误C2678:没有找到采用“分数”类型左手操作数的运算符(或没有可接受的转换)。我花了很多时间尝试解决这个问题,现在我了解到,因为num1和num2是不同类型的,所以无法添加它们,并且因为未将'+'运算符的返回指定为任何类型。我怎么解决这个问题?

Som*_*ude 6

您的重载operator+函数有两个const fraction<T>&参数。问题在于您使用的两个参数的类型不同,T每个参数的模板也不同。

开始解决它,您需要为每个参数使用不同的类型,这意味着两个模板参数。您还需要为返回的派生对象使用通用类型

就像是

template <typename U, typename V>
fraction<std::common_type_t<U, V>> operator+(const fraction<U>& fraction1, const fraction<V>& fraction2)
{
    fraction<std::common_type_t<U, V>> temp;

    // ...

    return temp;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我为它们使用了不同的模板参数名称。那是因为应该更容易地复制粘贴好友声明(还必须对其进行更新以匹配新功能),并且您不能隐藏模板参数(即,因为该类具有名为T朋友的模板参数)函数声明也不能这样)。