Tienes numerosos fallos en la función.
El tipo del que declares la función es el tipo de dato que tiene que retornar la función. Ej:
string nombre() {
/* haces lo que quieras con tu función */
string nombre = "Paco";
return nombre;
}
Para llamar a esta función desde otra, por ejemplo main solo necesitas usar el identificador y los paréntesis (no repitas el tipo que retorna la función). En este caso no tiene parámetros la función:
int main() {
cout << nombre() << endl;
return 0;
}
Si no quieres que se retorne nada puedes declarar la función como void:
void saludar() {
cout << "Hola Paco" << endl;
}
int main() {
saludar();
return 0;
}
Lo usual es hacer que las funciones sean puras, esto significa que se pueda reusar para por ejemplo imprimir distintos nombres en lugar de solo saludar a paco:
void saludar(string nombre) {
cout << "Hola " << nombre << endl;
}
int main() {
string nombre1 = "Paco";
string nombre2 = "Lucia";
saludar(nombre1);
saludar(nombre2);
return 0;
}
Para que pueden ser útiles las funciones que retornan un tipo? Por ejemplo para unir un vector (es un array que aumenta su tamaño automáticamente):
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string unir(vector<string> texto, string remplazo) {
string variableAuxiliar = "";
for (int i = 0; i < texto.size(); ++i) {
if (i + 1 != texto.size()) {
variableAuxiliar += texto[i] + remplazo;
} else {
variableAuxiliar += texto[i];
}
}
return variableAuxiliar;
}
int main() {
vector<string> meses = { "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre" };
string mesesSeparadosPorGuiones = unir(meses, "-");
cout << "Meses:" << mesesSeparadosPorGuiones << endl << endl;
cout << "Meses separados por saltos de lineas:" << unir(meses, "\n") << endl;
return 0;
}
Como ves la llamada a la función unir(vector, "remplazo") esremplazada por el valor que retorna. Asique puedes usarlo desde la función cout, como asignación de valor de un string o en cualquier otro lugar que tenga sentido meter un string, incluso en parámetros de otras funciones.
Entonces podrías hacer algo como:
void imprimir(string cualquierTexto) {
cout << "El texto introducido es:" << cualquierTexto << endl;
}
int main() {
string saludo = "Hola Paco";
imprimir(saludo);
imprimir( unir(meses, "-") );
return 0;
}
Al poder hacer esto se puede hacer recursividad. Es decir, una llamada que retorna un tipo, si uno de los parámetros es de ese tipo, se puede llamar a si misma.
unir(otroVector, unir(meses, "-") );
Es forma de usar funciones de forma recursiva sirve para conseguir el mismo efecto que con un bucle for o un while. Busca sobre el tema si te interesa.
También hay otro tipo de funciones que se llaman lambdas que son funciones pequeñas que no hace falta que declares fuera de main. Tiene sentido utilizarlas si es para hacer algo que no vas a volver a hacer en el futuro. Puedes echarles un ojo.