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