error: call of overload



  • Hallo alles zusammen,
    habe versucht ein Beispiel für Templates nachzubauen leider erhalte ich eine Fehlermeldung.
    hier ist der code

    #include <iostream>
    using namespace std;
    
    template <typename T>  
    T swap (T a, T b)
    {
    	T tmp;
    	tmp=a;
    	a=b;
    	b=tmp;
    }
    
    int main () {
        int a=4,b=3;
    	swap(a, b); 
    
        return 0;
    }
    

    und hier ist die Fehlermeldung.

    error: call of overloaded 'swap(int&, int&)' is ambiguous



  • Da Du mit using namespace std den gesamten std-Namensraum in den globalen importiert hast, hat das Funktionstemplate std::swap jetzt die gleiche Signatur wie Deine Funktion swap.



  • Es gibt in der Standard Bibliothek bereits eine Funktion swap() - und der Compiler kann nicht zwischen der std::swap() und deiner Funktion unterscheiden.

    (außerdem hat deine Funktion zwei Fehler: (a) sie übernimmt ihre Parameter als Kopie, dadurch siehst du von außen nichts von der Vertauschung - und (b) da fehlt die return-Anweisung)



  • Und /Users/alexanderschaubert/Xcode/C++/Object11/main.cpp:16: hat da sicher auch nichts verloren, Alex. 😉



  • Und zu guter letzt neben den anderen Hinweisen noch ein kleine Anmerkung:
    Du solltest besser die Deklaration einer Variablen an ihre Initialisierung hängen.

    Statt:

    T tmp;
        tmp=a;
        a=b;
        b=tmp;
    

    1 x Konstruktoraufruf
    3 x Zuweisung

    Lieber:

    T tmp=a;
        a=b;
        b=tmp;
    

    1 x Kopierkonstruktoraufruf
    2 x Zuweisung

    cu André



  • DANKE!!! 👍


Anmelden zum Antworten