g++.exe - Nicht ANSI-Konform bei Template-Spezialisierungen?



  • Hallo allerseits!
    Folgender Code: (Aus dem Buch C++ lernen und professionell anwenden)

    // spez_t.cpp: Zum Testen von Spezialisierungen
    // -----------------------------------------------
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    // Funktions-Template:
    template <class T>
    T min( T x, T y)
    {
        return( (x < y) ? x : y);
    }
    
    // ANSI-Spezialisierung:
    template<>
    const char* min( const char* s1, const char* s2 )
    {
        return (strcmp(s1,s2) < 0) ? s1 : s2;
    }
    
    int main()
    {
        int x = 1, y = 10;
    
        cout << "\n1. Zahl: " << x
             << "\n2. Zahl: " << y << endl
             << "\nDie kleinere Zahl: " << min(x,y)  << endl;
    
        const char str1[] = "GROSS", str2[] = "gross";
        cout << "\n1. String: " << str1
             << "\n2. String: " << str2 << endl;
        cout << "\nDer kleinere String: "
             << min(str1, str2) << endl;
    
        return 0;
    }
    

    Wollte heute ein paar eigene Template-Funktionen schreiben (mit Spezialisierungen). Doch darüber hat sich der Compiler (g++) beschwert. Gut hab ich gedacht. Wahrscheinlich habe ich das einfach noch nicht wirklich verstanden. Zum testen einfach mal den obigen Quellcode durch den Compiler gejagt => die gleichen Fehler.

    C:\code\cpp\test.cpp: In function `int main()':
    C:\code\cpp\test.cpp:27: error: call of overloaded `min(int&, int&)' is ambiguous
    C:\code\cpp\test.cpp:10: note: candidates are: T min(T, T) [with T = int]
    C:/Programme/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_algobase.h:151: note:                 const _Tp& std::min(const _Tp&, const _Tp&) [with _Tp = std::streamsize]
    
    C:\code\cpp\test.cpp:33: error: call of overloaded `min(const char[6], const char[6])' is ambiguous
    C:\code\cpp\test.cpp:17: note: candidates are: T min(T, T) [with T = const char*]
    C:/Programme/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_algobase.h:151: note:                 const _Tp& std::min(const _Tp&, const _Tp&) [with _Tp = char[6]]
    

    Liegt das nun daran, dass der obige Code fehlerhaft ist oder hält sich der g++ in diesem Falle nicht an den ANSI-Standard?

    Wäre super wenn mich jemand aufklären könnte.

    Caipi



  • 'min' gibt's schon. nenn' die templates irgendwie anders (my_min oder so)



  • net schrieb:

    'min' gibt's schon. nenn' die templates irgendwie anders (my_min oder so)

    Heißt das, dass es generell nicht geht, wenn ich eine allgemeine Template-Funktion und eine Spezialisierung gleichen Namens dieser Funktion habe? Oder liegt das am Compiler?

    Caipi



  • Ich glaube, net wollte darauf hinweisen, daß es im namespace std bereits eine Fkt. min gibt. Also packe deine min-Fkt. in einen eigenen Namensraum, oder entferne das using namespace std oder benenne deine Fkt. in myMin um ...



  • Arghh...
    Jetzt funktioniert es. Da wäre ich jetzt überhaupt nicht draufgekommen. (Auch weil ich dachte: "Die Autoren werden es schon wissen").

    Vielen Dank euch beiden! (Juhu. Der Tag ist gerettet :))

    Caipi


Anmelden zum Antworten