2013-02-23 35 views
7

Perché questo causa un errore del compilatore, affermando che i miei riferimenti sono ambigui? Ho uno float, int e string, che dovrebbero tutti creare firme di funzioni separate, giusto?Il riferimento alla funzione è ambiguo

Ecco quello che ho finora:

#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 
+0

In questa chiamata double d = plus (3.2, 4.2); quale funzione ti aspetti di essere chiamata con float o ints? – Slava

+0

Quali righe stanno causando l'errore? – Barmar

+0

@Barmar On 'int n = plus (3, 4); ' ' double d = plus (3.2, 4.2); ' ' string s = plus ("he", "llo"); 'e' string s3 = più (s1, s2); 'tutte le chiamate di funzione a più. – MarJamRob

risposta

15

Primo, non utilizzare using namespace std;. In questo caso, sembra che ci sia una struttura chiamata std::plus -oh, aspetta, non importa, che in realtà si chiama plus e il suo costruttore è gettato nel secchio per la risoluzione di sovraccarico con la tua funzione chiamata plus.


In secondo luogo, si ha un'ambiguità perché 3.2 e 4.2 sono di tipo double e può convertire altrettanto bene a float o int.

questa è una semplificazione, ma quando si tratta di passare numeri per una funzione di sovraccarico, C++ utilizza fondamentalmente queste regole:

  1. Se tutti gli argomenti corrispondono esattamente uno dei sovraccarichi, quindi utilizzare quello.
  2. Se tutti gli argomenti possono essere promossi per corrispondere a uno degli overload, quindi utilizzare quello.
  3. Se tutti gli argomenti possono essere convertiti numericamente in modo che corrispondano a uno degli overload, quindi utilizzare quello.

Se si dispone di più candidati a un livello specifico, si tratta di un'ambiguità. Fondamentalmente, un double non promuove a float -che sarebbe un downgrade. Quindi deve utilizzare una conversione standard in un float, che si collega alla conversione standard in un int, quindi questi due sovraccarichi sono ambigui.

4

chiamata del sovraccarico float in questo modo:

double d = plus(3.2f, 4.2f); 

Una costante come 3.2 ha in realtà digito doppia.

+0

Per qualche motivo, comunque, ho ancora gli stessi errori. – MarJamRob

+0

Che compilatore stai usando? Risolve il problema per me su VC++ 2010. – user1610015

+0

È in conflitto con 'std :: plus', ma ho usato g ++ e clang. – MarJamRob

Problemi correlati