Ошибка структуры: «Нет подходящей функции для вызова» - PullRequest
0 голосов
/ 24 августа 2018

Я просто делаю тест, в котором есть вопрос, добавив две дроби, но получаю ошибку,

нет соответствующей функции для вызова 'дробной части :: дроби ()'

мой код (неполный):

#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 голосов
/ 24 августа 2018

fraction::fraction() будет конструктором по умолчанию, а ваша структура не имеет его.

Как только вы объявили конструктор не по умолчанию fraction(int _numerator, int _denominator), компилятор перестал предоставлять свой собственный ctor по умолчанию (и вы не написали его для компенсации).

И вы пытаетесь вызвать (не существующий) ctor по умолчанию, когда делаете fraction result;, так что теперь у вас проблемы;вы пытаетесь вызвать функцию, которая не существует, и компилятор любезно сообщает вам об этом.

Если вам не нужно / не нужно предоставлять собственный конструктор по умолчанию для структуры, но вы согласны с тем, что компиляторсгенерировал бы, если бы вы не предоставили свой собственный конструктор не по умолчанию, тогда вы можете сказать компилятору «пожалуйста, дайте мне ваш ctor по умолчанию для этой структуры» с помощью fraction() = default;.Просто убедитесь, что это именно то, что вам нужно, и что вы на самом деле не хотите реализовывать свой собственный ctor по умолчанию (альтернативно, переделайте свой код, чтобы он не содержал вызова ctor по умолчанию).

0 голосов
/ 24 августа 2018

Ваша add функция использует

fraction result;

, который попытается найти конструктор fraction::fraction(), на который жалуется ваша ошибка.

Ваша структура имеет один конструктор, который принимает два числа:

fraction (int _numerator, int _denominator)

, поэтому при вводе result необходимо указать два числа:

fraction result(0, 0);

Есть и другие души, но в этом суть ошибки.

0 голосов
/ 24 августа 2018

Вы определили, но один двоичный конструктор. В таких случаях нулевой конструктор не определен неявно, поэтому вам нужно добавить в ваш класс что-то вроде

fraction() = default;

Или просто правильно построить результат:

fraction add(fraction a, fraction b){
    fraction result(a.numerator * b.denominator, a.denominator * b.numerator);
    return result;
}

Обратите внимание, что в предоставленном вами фрагменте вычисление результата является неполным (и я просто скопировал формулы из вашего кода).

0 голосов
/ 24 августа 2018

В вашей add функции у вас есть

fraction result;

Это попытается создать объект по умолчанию result. Но класс fraction не имеет конструктора по умолчанию, о чем говорит сообщение об ошибке.

Чтобы решить эту проблему, вам нужно либо добавить конструктор по умолчанию в класс fraction, либо использовать что-то вроде

fraction add(fraction a, fraction b){
    return fraction(a.numerator*b.denominator, a.denominator*b.numerator);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...