void sum(a,b) Невозможно преобразовать аргумент 1 из " comp" в "a"

#include <iostream>
#include <cmath>

void sum(struct a, struct b);
void mult(struct a, struct b);
void divis(struct a, struct b);

using namespace std;

struct comp {
    float Re;
    float Im;
};

int main() {
    setlocale(LC_ALL, "rus");
    comp a;
    comp b;

    cout << "\t\tПервое комплексное число\n";
    cout << "Введите действительную часть: ";
    cin >> a.Re; cout << endl;

    cout << "Введите мнимую часть: ";
    cin >> a.Im; cout << endl;

    if (a.Im > 0) {
        cout << "\tZ = " << a.Re << " + " << a.Im << endl;
    }
    else {
        cout << "\tZ = " << a.Re << " - " << abs(a.Im) << "i" << endl;
    }

    cout << endl << "\t\tВторое комплексное число\n";

    cout << "Введите действительную часть: ";
    cin >> b.Re; cout << endl;

    cout << "Введите мнимую часть: ";
    cin >> b.Im; cout << endl;

    if (b.Im > 0) {
        cout << "\tZ = " << b.Re << " + " << b.Im << endl;
    }
    else {
        cout << "\tZ = " << b.Re << " - " << abs(b.Im) << "i" << endl;
    }

    cout << ("Введите знак действия который хотите совершить -, +, *, /");
    char znak;
    cin >> znak;
    if (znak == '-' || znak == '+')
        cout << "Ответ: "; sum(a, b);    
    if (znak == '/')
        cout << "Ответ: "; divis(a, b);
    if (znak == '*')
        cout << "Ответ: "; mult(a, b);
}


void sum(comp a,comp b) {
    float RE = a.Re + b.Re;
    float IM = a.Im + b.Im;
    cout << "Ответ: ";
    if (IM < 0) {
        cout << RE << " - " << abs(IM) << "i\n";
    }
    else
        cout << RE << " + " << IM << "i\n";
}

void mult(comp a, comp b) {
    float RE = a.Re * b.Re - a.Im*b.Im;
    float IM = a.Re * b.Im + b.Re * a.Im;
    if (IM < 0)
        cout << RE << " - " << abs(IM) << "i\n";
    else
        cout << RE << " + " << IM << "i\n";
}

void divis(comp a, comp b) {
    float RE = (a.Re * b.Re + a.Im * b.Im) / (a.Im * a.Im + a.Re * a.Re);
    float IM = (a.Re * b.Im - b.Re * a.Im) / (a.Im * a.Im + a.Re * a.Re);
    if (IM < 0)
        cout << RE << " - " << abs(IM) << "i\n";
    else
        cout << RE << " + " << IM << "i\n";
}

Ответы (2 шт):

Автор решения: Павел Ериков
void sum(struct a, struct b);

Означает, что функция принимает 2 аргумента. Первый аргумент типа a, второй аргумент типа b, а вы хотите передавать в эту функция структуру comp.

В прототипе функции можно писать только тип аргумента, то есть так:

void sum(comp, comp);

Можно писать названия аргументов, но это не обязательно:

void sum(comp a, comp b);

Ну или же так:

void sum(struct comp a, struct comp b);

Но это больше стиль си. (Я лично ни разу не видел такое в коде на c++)

Так же ваши функции не знают о структуре comp. Для этого вы можете или структуру comp определить выше всех прототипов функций, которые её используют. Или так же написать прототип для структуры, например после uncludeов, но главное перед функциями использующие эту структуру:

struct comp;
→ Ссылка
Автор решения: ТарасПрогер
struct comp
{
    float Re;
    float Im;
};

void sum(comp a, comp b);
void mult(comp a, comp b);
void divis(comp a, comp b);
→ Ссылка