2013-08-09 16 views
8

Per quanto ne so, quando si sceglie di scegliere tra due funzioni candidate, il compilatore preferirà quella con la corrispondenza più debole. Per esempio, se ho:Risoluzione di sovraccarico

void boo(int i, char c); 
void boo(double d, int i); 

per il seguente codice:

float f = 1.0; 
char c = 'c'; 
boo(f,c); 

la seconda boo dovrebbe essere preferito perché la sua partita più debole è la promozione, mentre il primo è la conversione di tipo standard.

Ma quando provo a compilare (usando gcc), ottengo:

error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second.

Tutte le idee?

+14

Ho un'idea. Leggi quel messaggio di errore più e più volte finché non diventa chiaro che lo standard C++ dice che questo è ambiguo. –

+14

+1 per lo sviluppatore che ha scritto il messaggio di errore. – JNL

risposta

12

La tua comprensione della risoluzione di sovraccarico è errata. La regola generale (quando ci sono più di un argomento) è quella di scegliere una funzione per la quale almeno un argomento è migliore (non è così importante e nessuno degli altri è peggio. In altre parole, il compilatore elabora ogni argomento separatamente, creando un insieme di "migliori corrispondenze" per esso. Dopo questo, ci vuole l'unione di questi set: se l'intersezione contiene esattamente una funzione , hai vinto. Altrimenti, è ambiguo.

+0

Anche se non dovrei confrontare C++ con java ma c'è qualche differenza b/n il loro processo di controllo di sovraccarico - come sopra C++ il frammento di codice ambiguo funziona in Java (i tipi promossi uno esegue - cioè uno 'doppio int" – exexzian

+0

qui è il lavoro codice in java - http://ideone.com/8brQbE – exexzian

+0

grazie (credo che intendessi intersezione piuttosto che unione) – user2668673

0

Diciamo che hai chiamato la funzione f. Penso che il processo di risoluzione del sovraccarico sia: 1. Creazione di un set di funzioni candidate. Questo insieme di funzioni include tutte le funzioni denominate f a cui è possibile accedere dal punto in cui è stata chiamata f(). 2. Creazione di un insieme di funzioni valide. Questo insieme di funzioni è un sottoinsieme delle funzioni candidate per le quali il numero di parametri di ciascuna funzione valida concorda con il numero di argomenti che hai usato per chiamare f(). 3. Scegli la migliore funzione possibile. La migliore funzione valida è quella i cui parametri hanno tutti o sequenze di conversione implicite migliori o equivalenti rispetto a tutte le altre funzioni vitali. Se ce ne sono più o meno di uno (non esattamente uno), ci sarà un errore di compilazione. L'esempio seguente dimostra piacevolmente:

class cat 
{ 
public: 
    cat(int); 
}; 

void func(int, int, int, cat) 
{ 
    std::cout << 1 << std::endl; 
} 
void func(int, int, double, double) 
{ 
    std::cout << 2 << std::endl; 
} 

int main() 
{ 
    func(1,2,3,4); 
} 

Questo codice genera un errore di compilazione (VS) o avviso (g ++).

Di seguito vi funzionare correttamente (stampa 1):

void func(int, int, int, double) 
{ 
     std::cout << 1 << std::endl; 
} 
void func(int, double, double, double) 
{ 
     std::cout << 2 << std::endl; 
} 

int main() 
{ 
     func(1,2,3,4); 
} 
Problemi correlati