Template
-
hallo
was ist der unterschied zwischen den 2 templates. wie kann ich die in meiner main funktion objekte davon erzeugen
template < int zeilen, int spalten > class Matrix { }; template < int zeilen > class Matrix < zeilen, 1 > { };
-
Das zweite ist ne partielle Spezialisierung des Klassentemplates. Es setzt den zweiten Parameter auf 1.
Matrix<3, 4> m1; // allgemeines Template Matrix<3> m2; // Spezialisierung
-
ich hab die zwei zeilen in die ide eingegeben.
Matrix<3, 4> m1; // allgemeines Template Matrix<3> m2; // Spezialisierung
mein comiler (g++) bringt aber einen fehler
hallo.cpp:22: Fehler: falsche Anzahl der Templateargumente (1, sollte 2 sein)
hallo.cpp:7: Fehler: für »template<int zeilen, int spalten> class Matrix« bereitgestellt
hallo.cpp:22: Fehler: invalid type in declaration before »;« token
-
Das war natürlich Blödsinn
Matrix<3, 4> m1; // allgemeines Template Matrix<3, 1> m2; // Spezialisierung
Immer, wenn der zweite Parameter eine 1 ist, wird die Spezialisierung genommen, ansonsten das allgemeine Template. Um das erreichen zu können, was ich ursprünglich geschrieben hat, benutzt man Default-Parameter:
template < int zeilen, int spalten = 1 > class Matrix { };
-
Sieht zwar komisch aus, aber nen anderen Weg kenn ich nicht:
#include <iostream> template < int zeilen, int spalten = 1> struct Matrix { Matrix () {std::cout << " 2 " << std::endl; } }; template <int zeilen> struct Matrix <zeilen, 1> { Matrix () {std::cout << " 1 " << std::endl; } }; int main() { Matrix<4, 3> a; Matrix<3> b; }
bb
-
Ist das Verhalten durch den Standard definiert?
-
wieso kann man eine struktur so anlegen
// Matrix<3> b;
und eine klasse nicht
-
hansigarten2 schrieb:
wieso kann man eine struktur so anlegen
// Matrix<3> b;
und eine klasse nichtnein - kann man durchaus - du musst nur in zeile 3 gucken - und dann siehst du den Unterschied und wieso es zuvor nicht ging ^^
struct war nur, weil ich zu faul war, public zu schreiben und dir gleichzeitig zeigen wollte, dass das richtige aufgerufen wird ^^bb
-
aber wieso setzt man hier schon "spalten = 1"
template < int zeilen, int spalten = 1>
wenn man es erst bei dem anderen template haben möchte
-
damit es reicht, M anzugeben...
template < int zeilen, int spalten > class Matrix { }; template < int zeilen > class Matrix < zeilen, 1 > { }; int main() { Matrix<3, 4> a; Matrix<3, 1> b; }
geht ja wunderbar - allerdings, wenn man nicht zwangsweise
<3, 1>
schreiben will, dann braucht man diesen standard-parameter...bb
-
habs jetzt verstanden
thx für eure hilfe