如何解决在模板中重载算术运算符时的“错误:'operator='不匹配”

How to resolve "error: no match for ‘operator=’" when overloading arithmetic operators in a template

提问人:Matthew Fernandez 提问时间:5/17/2023 更新时间:5/17/2023 访问量:42

问:

我正在尝试使用同一类的对象制作一个具有函数算术的 fractionType 类,我还使用了一个模板,以便可以使用 int、float 或 double 构造 fractionType 对象。我一直在寻找一个又一个问题的解决方案,所以我需要帮助解决此代码中的上述错误:

主 .cpp:

#include <iostream>
#include "fractionType.h"
using namespace std;

int main()
{
    fractionType<int> x(4, 2);
    fractionType<double> y(5.2, 6.8);
    fractionType<float> z(1.0, 1.0);
    z = x + y;
    return 0;
}

fractionType.h:

#ifndef FRACTIONTYPE_H
#define FRACTIONTYPE_H
using namespace std;

template <class T>
class fractionType;


template <class T>
class fractionType
{
    public:
    explicit fractionType();
    explicit fractionType<T>(T num, T den);
    T numerator;
    T denominator;
};

template <class T>
fractionType<T>::fractionType()
{
    
}

template <class T>
fractionType<T>::fractionType(T num, T den)
{
    numerator = num;
    denominator = den;
}

template <typename U, typename V>
fractionType<int> operator + (const fractionType<U>& fraction1, const fractionType<V>& fraction2)
{
    fractionType<int> tempFraction(1,1);
    tempFraction.numerator = (fraction1.numerator * fraction2.denominator + fraction1.denominator * fraction2.numerator);
    tempFraction.denominator = (fraction1.denominator * fraction2.denominator);
    return tempFraction;
}
#endif

错误:

main.cpp: In function ‘int main()’:
main.cpp:10:13: error: no match for ‘operator=’ (operand types are ‘fractionType’ and ‘fractionType’)
   10 |     z = x + y;
      |             ^
In file included from main.cpp:2:
fractionType.h:10:7: note: candidate: ‘fractionType& fractionType::operator=(const fractionType&)’
   10 | class fractionType
      |       ^~~~~~~~~~~~
fractionType.h:10:7: note:   no known conversion for argument 1 from ‘fractionType’ to ‘const fractionType&’
fractionType.h:10:7: note: candidate: ‘fractionType& fractionType::operator=(fractionType&&)’
fractionType.h:10:7: note:   no known conversion for argument 1 from ‘fractionType’ to ‘fractionType&&’

有什么建议吗?

C++ Templates 运算符重载

评论

2赞 Some programmer dude 5/17/2023
模板参数是类型的一部分。 是与 不同的类型。这两种类型不可相互转换,除非您已为其实现运算符。在你展示的代码中(这与你得到的错误并不匹配),你尝试将一个值分配给一个值。fractionType<int>fractionType<float>fractionType<int>fractionType<float>
1赞 Some programmer dude 5/17/2023
如果您查看从您显示的代码创建的实际错误消息,我上面提到的问题将非常清楚。
0赞 Some programmer dude 5/17/2023
一个完全不同的说明:在源文件中使用命名空间 std; 是一个坏习惯。在头文件中这样做,我们中的许多人会认为直接是错误的。

答:

2赞 Remy Lebeau 5/17/2023 #1

在语句中,表达式返回 a ,但 是 。您尚未定义允许该分配的转换,因此会出现错误。z = x + y;x + yfractionType<int>zfractionType<float>

您可以:

  1. 定义一个复制构造函数,允许您从其他类型的对象进行构造,例如:*thisfractionType
template <class T>
class fractionType
{
public:
    ...
    template <typename U>
    fractionType(const fractionType<U> &src) {
        numerator = static_cast<T>(src.numerator);
        denominator = static_cast<T>(src.denominator);
    }
};
  1. 定义一个赋值运算符,允许您将其他类型的对象赋值给 ,例如:fractionType*this
template <class T>
class fractionType
{
public:
    ...
    template <typename U>
    fractionType<T>& operator=(const fractionType<U> &rhs) {
        numerator = static_cast<T>(rhs.numerator);
        denominator = static_cast<T>(rhs.denominator);
        return *this;
    }
};
  1. 定义一个转换运算符,允许您转换为其他类型的对象,例如:*thisfractionType
template <class T>
class fractionType
{
public:
    ...
    template <typename U>
    operator fractionType<U>() const { 
        return fractionType<U>(static_cast<U>(numerator), static_cast<U>(denominator));
    }
};

评论

0赞 Matthew Fernandez 5/17/2023
非常感谢你,它奏效了!我使用了您提供的第二个选项,即定义赋值运算符的选项。