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 nicht

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


Log in to reply