算术运算符对类模板的过载,操作员应采用两类不同类型的类别
Arithmetic operator overloading for class template, the operator should take two classes of different types
我正在制作分数,分子和分母可以是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
朋友函数声明也不能具有它(。
相关文章:
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何检查派生类的类型?(C++实例)
- 可以将两个相同类型的连续数组视为一个数组吗?
- 将类指针类型转换为键时出错
- 如何构造可以调用和返回两种不同类型的模板
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- C++:模板类的类型定义
- 模板类默认类型和条件
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- C++类字符串类型的迭代器
- 有没有办法让C++函数采用具有相同成员的两种不同类型?
- [[no_unique_address]] 和两个相同类型的成员值
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 从基类的唯一指针中声明派生类的类型
- C++将两个不同类型的向量的属性连接到新的向量中
- C++ 从两类中确定无效类型*
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 算术运算符对类模板的过载,操作员应采用两类不同类型的类别
- 如何将用户定义的类用作模板类的类型,并正确重载这两个类的<<?