El error es claro y conciso, tal vez no lo entiendes por estar en inglés. Te lo traduzco:
type 'sumar' does not provide a call operator.
el tipo 'sumar' no proporciona un operador de llamada.
Un operador de llamada es el operador paréntesis (()
), puedes establecer parámetros arbitrarios a dicho operador igual que si fuese una función, los cambios que debes hacer a tu código para usar el operador de llamada son los siguientes:
class sumar{
public:
int operator()(int a, int b); // Operador de llamada (int, int)
int operator()(int a, int b, int c); // Operador de llamada (int, int, int)
float operator()(float a, float b); // Operador de llamada (float, float)
float operator()(float a, float b, float c); // Operador de llamada (float, float, float)
};
int sumar::operator()(int a, int b){
return (a+b);
}
int sumar::operator()(int a, int b, int c){
return (a+b+c);
}
float sumar::operator()(float a, float b){
return (float)(a+b);
}
float sumar::operator()(float a, float b, float c){
return (float) (a+b+c);
}
Si en realidad querías llamar a la función miembro sumar::suma
, las llamadas en main
deberían ser así:
int main() {
sumar mi_suma;
/* Primer meotodo */
cout << "\n\nSuma 1: " << mi_suma.suma(1,2);
// ~~~~ <--- Llama a sumar::suma(int, int)
/* Segundo metodo */
cout << "\nSuma 2: " << mi_suma.suma(1,2,3);
// ~~~~ <--- Llama a sumar::suma(int, int, int)
/* Tercer metodo */
cout << "\nSuma 3: " << mi_suma.suma(3.1,2.7);
// ~~~~ <--- Debería llamar a sumar::suma(double, double)
/* Cuarto metodo */
cout << "\nSuma 4: " << mi_suma.suma(3.1,2.7,10.2) << "\n\n";
// ~~~~ <--- Debería llamar a sumar::suma(double, double, double)
}
Otras cosas a tener en cuenta.
No conviertas a float
datos que ya son float
, es bastante confuso:
float sumar::suma(float a, float b){
return (a+b); // 'a' y 'b' ya son float, la conversión es innecesaria
}
float sumar::suma(float a, float b, float c){
return (a+b+c); // 'a', 'b' y 'c' ya son float, la conversión es innecesaria
}
El literal de float
incluye el sufijo f
, si no pones dicho sufijo cualquier número con coma flotante será double
:
cout << "\nSuma 3: " << mi_suma(3.1f, 2.7f);
// Literales 'float' ------------> ^ ^
cout << "\nSuma 4: " << mi_suma(3.1f, 2.7f, 10.2f) << "\n\n";
// Literales 'float' ------------> ^ ^ ^
En c++, cuando un método no recibe parámetros, se deja su lista de parámetros vacía en lugar de poner void
:
int main() // Correcto.
int main(void) // Incorrecto.
La función main
debe devolver un valor. Lee este hilo para saber más del tema.
int main() {
...
return 0;
}
Consejo.
No es práctico repetir funciones para que hagan lo mismo, en su lugar usa plantillas:
class sumar{
public:
template <typename ... TIPOS>
auto suma(TIPOS ... valores)
{
return (valores + ...);
}
};
Puedes ver el código funcionando en Try it online!.