提问人:Matthew Fernandez 提问时间:5/17/2023 更新时间:5/17/2023 访问量:42
如何解决在模板中重载算术运算符时的“错误:'operator='不匹配”
How to resolve "error: no match for ‘operator=’" when overloading arithmetic operators in a template
问:
我正在尝试使用同一类的对象制作一个具有函数算术的 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&&’
有什么建议吗?
答:
2赞
Remy Lebeau
5/17/2023
#1
在语句中,表达式返回 a ,但 是 。您尚未定义允许该分配的转换,因此会出现错误。z = x + y;
x + y
fractionType<int>
z
fractionType<float>
您可以:
- 定义一个复制构造函数,允许您从其他类型的对象进行构造,例如:
*this
fractionType
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);
}
};
- 定义一个赋值运算符,允许您将其他类型的对象赋值给 ,例如:
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;
}
};
- 定义一个转换运算符,允许您转换为其他类型的对象,例如:
*this
fractionType
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
非常感谢你,它奏效了!我使用了您提供的第二个选项,即定义赋值运算符的选项。
评论
fractionType<int>
fractionType<float>
fractionType<int>
fractionType<float>
使用命名空间 std;
是一个坏习惯。在头文件中这样做,我们中的许多人会认为直接是错误的。