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!!