算术运算符对类模板的过载,操作员应采用两类不同类型的类别

Arithmetic operator overloading for class template, the operator should take two classes of different types

本文关键字:两类 同类型 运算符 操作员      更新时间:2023-10-16

我正在制作分数,分子和分母可以是int,float或double的模板类。当我尝试添加两个类时,当算术或关系运算符超载时会出现错误

在标题文件" 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;
}

和CPP文件

#include"fraction.h"
int main()
{
    fraction<int> num1(5,6);
    fraction<double> num2(5.1,6.1);
    fraction<double> num3();
    cout << num1+num2; 
}

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

您的重载operator+功能需要两个const fraction<T>&参数。问题是您使用的两个参数是不同类型的,每个参数的T模板都不同。

to 开始 您需要为每个参数使用不同的类型,这意味着两个模板参数。您还需要对返回的派系对象有一个公共类型。

之类的东西
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;
}

请注意,我对两个都使用不同的模板参数名称。那是因为应该更容易复制朋友声明(也必须更新以匹配新功能(,并且您不能 shadow 一个模板参数(也就是说,因为类有一个模板参数名称 T朋友函数声明也不能具有它(。