我只是做一个有问题的测试,将两个分数相加,但得到一个错误,
没有匹配函数可调用'fraction :: fraction()'
我的代码(不完整):
#include <iostream>
using namespace std;
struct fraction{
int numerator, denominator;
fraction (int _numerator, int _denominator){
numerator=_numerator;
denominator=_denominator;
}
};
fraction add(fraction a, fraction b){
fraction result;
result.numerator=a.numerator*b.denominator;
result.denominator=a.denominator*b.numerator;
return result;
}
void reduce(fraction &a)
{
int n=0;
for(int i=a.numerator;i>=1;i--)
{
if(a.numerator%i==0&&a.denominator%i==0)
{
n==i;
}
}
a.numerator/=n;
a.denominator/=n;
}
答案 0 :(得分:3)
在您的add
函数中,您拥有
fraction result;
这将尝试默认构造result
对象。但是fraction
类没有默认的构造函数,这就是错误消息告诉您的内容。
要解决此问题,您需要向fraction
类添加默认构造函数,或使用类似的
fraction add(fraction a, fraction b){
return fraction(a.numerator*b.denominator, a.denominator*b.numerator);
}
答案 1 :(得分:1)
您的add
函数使用
fraction result;
它将尝试找到fraction::fraction()
构造函数,您的错误抱怨找不到它。
您的结构体有一个采用两个数字的构造器:
fraction (int _numerator, int _denominator)
因此,您在输入result
时需要提供两个数字:
fraction result(0, 0);
还有其他方面,但这就是错误含义的本质。
答案 2 :(得分:1)
您只定义了一个二进制构造函数。在这种情况下,不会隐式定义null构造函数,因此您需要在类中添加
fraction() = default;
或者只是正确地构造结果:
fraction add(fraction a, fraction b){
fraction result(a.numerator * b.denominator, a.denominator * b.numerator);
return result;
}
请注意,您提供的摘录中的结果计算不完整(我只是从您的代码中复制了公式。)
答案 3 :(得分:1)
fraction::fraction()
将是默认的构造函数,而您的结构没有任何构造函数。
一旦声明了 non-default 构造函数fraction(int _numerator, int _denominator)
,编译器便停止提供其自己的默认ctor(并且您没有编写一个补偿值)。
并且您尝试在执行fraction result;
时调用(不存在的)默认ctor,所以现在您遇到了麻烦;您尝试调用一个不存在的函数,编译器会告诉您。
如果您不需要/想要为结构提供自己的默认构造函数,但是如果您不提供自己的非默认构造函数,则可以很好地满足编译器生成的内容,则可以告诉编译器执行以下操作: fraction() = default;
“请给我这个结构的默认ctor”。只需确保这就是您想要的,并且您实际上并不想实现自己的自定义默认ctor(或者,重新编写代码,使其不包含任何默认ctor的调用)。