当前位置: 首页 > 知识库问答 >
问题:

算术运算符重载对于类模板,运算符应该取两个不同类型的类

子车俊哲
2023-03-14

我正在为分数制作一个模板类,分子和分母可以是int、浮点数或双精度类型。当重载算术或关系运算符时,当我尝试添加两个类时,它会出现错误,比如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;
}

在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,说二进制“”:没有找到接受“fraction”类型的左操作数的运算符(或者没有可接受的转换)。我花了很多时间试图解决这个问题,现在我明白了,因为num1和num2是不同的类型,所以它们不能相加,因为“”运算符的返回没有被指定为任何类型。我该如何解决这个问题?

共有1个答案

卢晟
2023-03-14

您的重载< code >运算符函数采用两个< code >常量分数

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

类似的东西

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;
}

请注意,我对它们都使用不同的模板参数名称。这是因为复制粘贴友元声明应该更容易(还必须更新以匹配新函数),并且不能隐藏模板参数(也就是说,因为类具有模板参数名称 T,因此友元函数声明不能具有它)。

 类似资料:
  • 我在运算符过载时遇到问题 主要是我有 其中<code>Integer</code>只是<code>int</code>的包装,带有我需要的一些特殊功能。 然而,当我编译上面的代码时,我得到了错误C2679,它表示<code>binary' 我还试图删除友元声明中的参数,因此代码变成了: 但这会产生另一个错误:C2785:

  • 我在surf.h中有以下代码,其中声明了一个具有两种不同类型的模板类: 然后定义一个新类,其中创建了一个类型为T的向量(在field.h中) 在main.cpp中,我使用了这个字段。 我用G++(版本5.4)编译它,得到以下错误: 从main.cpp:2:0:field.h:在“std::ostream&operator<<(std::ostream&,const field&)[with T=s

  • 我有一个模板类包含其他类的优先级队列,我需要使用优先级重载器调用各个类重载器,根据各个类的偏好进行比较(在这种情况下是年龄,在另一个类中可能是价格。 我绝对相信我已经实现了不正确的运算符重载,因此非常感谢您的建议。 举个例子 我得到这个错误,我不知道我需要做什么来修复它。我必须将类重载保持为单个变量(Animal) 任务cpp:在“布尔运算符”的实例化中

  • 在下面的代码中,是一个模板类,取决于非类型参数。为和定义了friend。还依赖于另一个bool模板参数。 在Coliru上看现场直播。 现在,我想给出的模板参数的默认值,例如,以便以下语句 相当于 如果我在 同样,它不编译给出错误 main.cpp:27:15:错误:重新声明friend'template std::ostream&operator<<(std::ostream&,const a&

  • 问题内容: 给定以下JavaScript“类”定义,这是我想到此问题的最佳方式: 以及以下测试设置代码: 有什么方法可以使用加法运算符隐式创建为对象,如下所示… 而不是求助于… 如果不是,那么在此领域中关于通过算术运算符使自定义数字JavaScript对象可组合的最佳实践建议是什么? 问题答案: 据我所知,JavaScript(至少现在已经存在)不支持运算符重载。 我能建议的最好的方法是使用一个类

  • 我对这个错误有意见 错误LNK2019未解析的外部符号"类std::basic_ostream 现在,< code>post所做的就是调用< code >操作符 宣言 定义 它们分别位于文件和中,我要求运算符不是成员函数(用于赋值)。