Compilerfehler bei Templates



  • Hallo, bei mir kommt immer Compilerfehler raus wenn ich folgendes compilieren will:

    #include <iostream>
    using namespace std;
    
    template <class T>
    T min( T x, T y)
    {
        return( (x < y) ? x : y);
    }
    
    int main()
    {
        short x = 10, y = 2;
    
        cout << "Die kleinere Zahl: " << min(x, y) << endl;    
    
        return 0;
    }
    

    es steht aber genauso wie im Buch. Trotzdem geht er nicht. Wieso nicht?
    In der Ausgabe steht:

    ------ Erstellen gestartet: Projekt: mini, Konfiguration: Debug Win32 ------
    Kompilieren...
    MINI_T.CPP
    l:\cpp\notebook programmierung\c++ lernen und professionell anwenden\ansi\kap32\mini_t.cpp(22) : error C2668: 'min': Mehrdeutiger Aufruf einer überladenen Funktion
            l:\cpp\notebook programmierung\c++ lernen und professionell anwenden\ansi\kap32\mini_t.cpp(10): kann 'T min<short>(T,T)' sein
            with
            [
                T=short
            ]
            o:\programme\microsoft visual studio 8\vc\include\xutility(2951): oder "const _Ty &std::min<short>(const _Ty &,const _Ty &)"
            with
            [
                _Ty=short
            ]
            bei Anpassung der Argumentliste '(short, short)'
    Das Buildprotokoll wurde unter "file://l:\CPP\Notebook Programmierung\C++ Lernen und Professionell anwenden\ANSI\KAP32\Debug\BuildLog.htm" gespeichert.
    mini - 1 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    


  • nun, dann ist das buch wohl fehlerhaft 😃

    benenne das vielleicht mal so um:

    T minimum( T x, T y)
    

    wie der fehler schon, sagt. min ist bereits im namespace std definiert, und
    anhand der typen kann der kompiler nicht entscheiden welches er denn benutzen
    soll.



  • naja, weil es scheinbar die funktion

    const _Ty &std::min<short>(const _Ty &,const _Ty &);
    

    in der standard bibliothek gibt.
    nenn deine funktion einfach wengl um, dann sollte es gehen



  • Es gibt bereits eine Funktion min() in der Standard-Bibliothek (die offenbar auf Umwegen von der iostream-Bibliothek eingebunden wird) - und deren Signatur kann nicht von deiner Template-Funktion unterschieden werden. Du könntest das Problem lösen, indem du das "using namespace std;" weglässt und die std::-Namen voll spezifizierst (oder gezielt importierst):

    #include <iostream>
    using std::cout;
    using std::endl;
    ...
    

    (oder indem du deine Funktion umbenennst)



  • Vorden schrieb:

    nenn deine funktion einfach wengl um, dann sollte es gehen

    *hust* Namespaces *hust* 🙂



  • muahaha, ich war der schnellste 😛



  • achso das war es!

    war total verwirrt. sogar das aus wiki funktionierte nicht
    die benützten "max"

    danke!!


Anmelden zum Antworten