2013-02-23 8 views
7

Dlaczego ta przyczyna jest przyczyną błędu kompilatora, stwierdzając, że moje odwołania są niejednoznaczne? Mam float, int i string, które powinny wszystkie tworzyć osobne sygnatury funkcji, prawda?Odniesienie do funkcji jest niejednoznaczne

Oto co mam do tej pory:

#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

W tym wywołaniu podwójne d = plus (3.2, 4.2); jakiej funkcji spodziewasz się wywoływać za pomocą floats lub ints? – Slava

+0

Które linie powodują błąd? – Barmar

+0

@Barmar On 'int n = plus (3, 4);' 'double d = plus (3.2, 4.2);' 'string s = plus (" he "," llo ");' i 'ciąg s3 = plus (s1, s2); 'wszystkie wywołania funkcji do plusa. – MarJamRob

Odpowiedz

15

Po pierwsze, nie używaj using namespace std;. W tym przypadku występuje struktura o nazwie std::plus -oh, czekaj, nieważne, to tak naprawdę nazywa się plus, a jej konstruktor jest wrzucany do kubełka w celu sprawdzenia przeciążenia za pomocą funkcji o nazwie plus.


Po drugie, masz niejasności, ponieważ 3.2 i 4.2 są typu double i może przekształcić się równie dobrze do float lub int.

Jest to uproszczenie, ale jeśli chodzi o przepuszczanie numery do przeciążonej funkcji C++ w zasadzie używa tych zasad:

  1. Jeśli wszystkie argumenty dokładnie dopasować jedną z przeciążeniami, a następnie użyć tego.
  2. Jeśli wszystkie argumenty mogą być promowane w celu dopasowania jednego z przeciążeń, użyj tego.
  3. Jeśli wszystkie argumenty można przekonwertować liczbowo, aby dopasować jedno z przeciążeń, użyj tego.

Jeśli masz wielu kandydatów na określonym poziomie, jest to dwuznaczność. Co ważne, double nie promuje do wersji float, co oznacza obniżenie wersji. Musi więc użyć standardowej konwersji do float, która wiąże się ze standardową konwersją do int, więc te dwa przeciążenia są niejednoznaczne.

4

Wywołać Przeciążenie pływaka tak:

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

Stała jak 3.2 faktycznie ma typ podwójne.

+0

Z jakiegoś powodu nadal otrzymuję te same błędy. – MarJamRob

+0

Jakiego kompilatora używasz? Rozwiązuje problem dla mnie w VC++ 2010. – user1610015

+0

To jest sprzeczne z 'std :: plus', ale użyłem g ++ i clang. – MarJamRob

Powiązane problemy