Problem mit template
-
Moin Leutz

Ich bin grad dabei den Umgang mit Templates zu lernen und prompt auf ein Problem gestoßen, das ich nicht verstehe.
#include <iostream> using namespace std; template<typename T> T max( T a, T b) { if (a > b) return a; else return b; } int main() { cout << max(1, 2); return 0; }Das Programm soll also a und b vergleichen und das größere zurückgeben. Das Problem dabei ist nur dass mir der Compiler folgende Fehlermeldungen ausspuckt, mit denen ich absolut nichts anfangen kann.
/home/fakka/Dokumente/cpp/tmp/main.cpp|30|Fehler: Aufruf des überladenen »max(int, int)« ist nicht eindeutig|
/home/fakka/Dokumente/cpp/tmp/main.cpp|30|Anmerkung: Kandidaten sind:|
/home/fakka/Dokumente/cpp/tmp/main.cpp|18|Anmerkung: T max(T, T) [with T = int]|
/usr/include/c++/4.6/bits/stl_algobase.h|210|Anmerkung: const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]|
||=== Erstellen beendet: 4 Fehler, 0 Warnungen===|was meint der mit nicht eindeutig und warum überladen?
Und vor allem in Zeile 30? das Prog hat nur 20 Zeilen.
Bei wikipedia ( http://de.wikipedia.org/wiki/Template_(Programmierung) )
ist in etwa die gleiche Funktion beschrieben. ist wikipedia falsch oder hab ich bei mir einen Fehler übersehn?
-
Ein schönes Beispiel, warum man mit
using namespace std;vorsichtig umgehen sollte.
-
hui danke für die schnelle Antwort. daran lags

So, nächste Frage: Warum?
-
...
-
Swordfish schrieb:
Weil
using namespace std;alle Bezeichner des Namensraumsstdauch im globalen Namensraum bekannt macht. Und dabei kollidiert schlicht deinmax()mitstd::max().#include <iostream> template< typename T > T max( T a, T b) { if (a > b) return a; else return b; } int main() { using std::cout; cout << max( 1, 2 ); }
musste jetzt kurz überlegen aber stimmt ja! std hat ja auch ne max fkt, ganz vergessen

habs jetzt so gelöst
#include <iostream> using namespace std; template<typename T> T xy( T a, T b) { if (a > b) return a; else return b; } int main() { cout << xy(1, 2); return 0; }
-
...
-
Ich finds gut, er hat seinen Fehler nicht erkannt, aber durch einen größeren behoben.
xy ist für mich ein sehr aussagekräftiger und toller Funktionsname, den ich auch 7-8mal in meinem Programm hab.
-
fakka270390 schrieb:
...habs jetzt so gelöst...
Wie wäre es damit?
#include <iostream> //using namespace std; weg damit template<typename T> T max( T a, T b) { if (a > b) return a; else return b; } int main() { std::cout << max(1, 2); //std::cout anstatt cout return 0; }
-
Wie wärs, wenn er einfach die Funktion aus der Standard-Lib verwendet?
-
...
-
Ahh... sry ^^
Edit: Swordfish, keine herablassendes Kommentar? Womit habe ich das verdient
-
Zum lernen kann man doch gerne mal was aus der STL nachprogrammieren oO
Wieso wird das immer als schlecht geredet?
-
Skym0sh0 schrieb:
Wieso wird das immer als schlecht geredet?
Hab ich doch nicht! Ich habe das mit dem Lernen übersehen

-
Vogel, du !
Warum bist du eigentlich nicht in der Schule?
Machste wieder blau?
-
...
-
Swordfish schrieb:
Sone schrieb:
Swordfish, keine herablassendes Kommentar? Womit habe ich das verdient

War wohl zu subtil für dich. Zum nachlesen:
Sone schrieb:
[...] wenn er einfach die [...] Standard-Lib verwendest?
Swordfish schrieb:
Er verwendest sie bewusst nicht: [...]
Hab den Edit nicht gelesen.
Skym0sh0 schrieb:
Vogel, du !
Du hast Genie falsch geschrieben.
Warum bist du eigentlich nicht in der Schule?
Machste wieder blau?Ich bin in der Schule. Wir dürfen allerdings Laptops benutzen

-
...
-
Swordfish schrieb:
Sone schrieb:
Wir dürfen allerdings Laptops benutzen

Wozu dürft ihr sie denn Benutzen?
Das ist irrelevant. Sobald wir sie benutzen dürfen (für was auch immer), hat der Lehrer keine Kontrolle mehr, was wir nebenbei damit tun ...

Edit: Naja, vielleicht der Schul-Router....
-
-
...