2011-08-21 15 views
5

De acuerdo con mi compilador gcc-4.6, la llamada a func en el ejemplo siguiente es ambigua.Llamada ambigua (conversión de char * a lambda vs std :: cadena)

void func(const std::string &str) { 
} 

void func(std::function<std::string()> f) { 
} 

void test() { 
    func("Hello"); 
} 

es el compilador correcto al decir esto? Si elimino la primera sobrecarga, este código no se compilará, ya que no creará una instancia de las plantillas involucradas.

¿Hay alguna forma de resolver esto al renombrar una de las dos funciones o al convertir explícitamente a std :: string?

Respuesta

3

También puede añadir una tercera sobrecarga para capturar de forma explícita el caso literal de cadena:

void func(char const* cstr) { 
    return func(std::string(cstr)); 
} 
4

se puede resolver por SFINAE en el constructor de std::function. Sin embargo, no parece ser necesario y GCC no lo proporciona. Entonces no puedes depender de que funcione.

+0

¡Eso parece ridículo! –

+1

@Tomalak: Lo es. – Puppy

+0

Ni siquiera estoy seguro de si las implementaciones pueden hacer esto. Me alegraría que alguien pudiera encontrar una referencia de especificación o explicar más. –

Cuestiones relacionadas