2011-08-21 17 views
5

Secondo il mio compilatore gcc-4.6 la chiamata a func nell'esempio seguente è ambiguo.ambiguo chiamata (conversione da char * a lambda vs std :: string)

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

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

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

Il compilatore è corretto nel dire questo? Se rimuovo il primo overload di questo codice non viene compilato in quanto sarà in grado di istanziare i modelli coinvolti.

Esiste un modo per risolvere questo accanto o rinominare una delle due funzioni o esplicitamente la conversione a std :: string?

risposta

3

Si potrebbe anche aggiungere un terzo di sovraccarico per catturare in modo esplicito il caso letterale stringa:

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

può essere risolto dal SFINAE nel costruttore di std::function. Tuttavia, non sembra essere richiesto e non è fornito da GCC. Quindi non puoi dipendere da che dipende.

+0

Che sembra ridicolo! –

+1

@Tomalak: lo è. – Puppy

+0

Non sono nemmeno sicuro se le implementazioni sono autorizzati a farlo. Sarei felice se qualcuno potesse trovare un riferimento alle specifiche o spiegare ulteriormente. –

Problemi correlati