La referencia a la función es ambigua [duplicada]

Esta pregunta ya tiene una respuesta aquí:

Extraño error ambiguo de llamada a función sobrecargada 11 respuestas

¿Por qué esto causa un error del compilador que indica que mis referencias son ambiguas? tengo unfloat, int ystring, que deberían crear firmas de funciones separadas, ¿verdad?

Aquí está lo que tengo hasta ahora:

#include <iostream>
#include <string>
using namespace std;

int plus(int a, int b);
float plus(float a, float b);
string plus(string a, string b);

int main(void)
{
    int n = plus(3, 4);
    double d = plus(3.2, 4.2);
    string s = plus("he", "llo");
    string s1 = "aaa";
    string s2 = "bbb";
    string s3 = plus(s1, s2);
}

int plus(int a, int b) {
    return a+b;
} // int version

float plus(float a, float b) {
    return a+b;
} // float version

string plus(string a, string b) {
    return a+b;
} // string version

Respuestas a la pregunta(2)

Su respuesta a la pregunta