Templates
-
Hallo ^^
Ich habe gleich 2 Fragen bezüglich Templates:1. Wie lege ich Standard-Werte für die Template-Argumente fest oder geht das gar nicht? Also so was in etwa:
template <class T = int> class ZAHL { T real_zahl; }2. Kann ich irgendwie das Problem umgehen, dass die 0 (auch) als Pointer und nicht (nur) als int angesehen wird? So weit ich mitbekommen habe sollte dafür ja explicit da sein - allerdings bekomm ichs auch damit nicht hin

Um mal bei meinem Beispiel zu bleiben
//mir fällt gerade auf, dass das eigtl doch ne so wirklich was mit templates zu tun hat ^^ class ZAHL { ZAHL (int); ZAHL (const char *) throw (...); } //------------------------------------------------------- ZAHL t (0); //ZAHL t ((int) 0) is immer so viel zu tippenDanke schon mal - und sry, falls ich zu dumm zum Suchen war ^^
bb
-
zu 1) genau so gehts. Sollte aber auch im C++-Buch deiner Wahl stehen. s steh auf jeden Fall in deiner STL, wo die optionalen Teamplateargumente der Container die Allokatoren sind.
zu 2) Dein Problem ist keins. 0 ist in erster Linie immer ein int. Die Umwandlung in einern Nullpointer ist ein impliziter Cast, der in deinem Fall nicht angewandt wird, da ZAHL::ZAHL(int) den besseren Match liefert.
-
hmm... dann hier mal der komplette Code:
using namespace my_math; #include <iostream> int main (int argc, char *argv[]) { ZAHL z (0); BRUCH t; return 0; }class ZAHL { private: //... public: //... ZAHL (void) : m_neg (false), m_Zahl (), m_Dez () {}; ZAHL (__int64); ZAHL (const char *) throw (...); }; template <class ZAEHLER = ZAHL, class NENNER = ZAEHLER> class BRUCH { private: ZAEHLER m_zaehler; NENNER m_nenner; public: BRUCH (void) : m_zaehler ((__int64) 0), m_nenner (1) {}; BRUCH (const ZAEHLER &z) : m_zaehler (z), m_nenner (1) {}; BRUCH (const ZAEHLER &z, const NENNER &n) : m_zaehler (z), m_nenner (n) {}; };Und die zugehörigen Fehlermeldungen:
1>c:\users\tommy\documents\visual studio 2005\projects\zahlen\zahlen\zahlen.cpp(12) : error C2668: 'my_math::ZAHL::ZAHL': Mehrdeutiger Aufruf einer überladenen Funktion 1> c:\users\tommy\desktop\zahl.hpp(20): kann 'my_math::ZAHL::ZAHL(const char *) throw(...)' sein 1> c:\users\tommy\desktop\zahl.hpp(19): oder "my_math::ZAHL::ZAHL(__int64)" 1> bei Anpassung der Argumentliste '(int)' 1>c:\users\tommy\documents\visual studio 2005\projects\zahlen\zahlen\zahlen.cpp(13) : error C2133: 't': Unbekannte Größe 1>c:\users\tommy\documents\visual studio 2005\projects\zahlen\zahlen\zahlen.cpp(13) : error C2512: 'my_math::BRUCH': Kein geeigneter Standardkonstruktor verfügbarDanke schon mal : ) bb
-
Das geht so nicht. Was Du brauchst sind sogenannte "Policy classes" und "Traits". Leider ist das ein recht komplexes Thema, das recht schwer zu erklären ist. Suche mal im Netz danach.
-
Wenn ich das jetzt richtig verstanden habe geht das also so:
template <class ZAEHLER, class NENNER = ZAEHLER> class BRUCH {/*...*/};aber der erste Parameter muss gegeben sein?!
edit:
ahh - das prob lag daran, dass ich das <> weggelassen habe ^^BRUCH <> t; //--------------------------------------------------------- template <class ZAEHLER = ZAHL, class NENNER = ZAEHLER> class BRUCH {/*...*/};so gehts jz ^^
Und wie bekomm ich jz die 0 dazu eher als int als als pointer interpretiert zu werden? ^^
-
0 ist ein int. du verwendest aber nicht int, sondern den typen __int64.
lösung: verwende __int64, in dem du 0 als __int64 übergibst (womöglich als0LL- frag dein compilerhandbuch) - oder implementiere einen weiteren konstruktor:Zahl::Zahl (int);