struct error:“没有匹配的函数来调用”

时间:2018-08-24 12:51:31

标签: c++ struct

我只是做一个有问题的测试,将两个分数相加,但得到一个错误,

  

没有匹配函数可调用'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;

}

4 个答案:

答案 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的调用)。