template-variable in einer methode



  • Hallo,
    ich versuche mich an einem Bit-editor. Hat auch bisher alles funktioniert solange ich meine variable fest definiere. Wenn ich aber den template-parameter in einer templatevariable in der methode einbinde bekomme ich immer eine fehlermeldung.

    Zum verständnis: ich habe eine variable und mein programm gibt dieses in binärcode aus. diese variable möchte ich wiederum in eine temporäre templatevariable übergeben, da ich meine ursprüngliche templatevariable nicht "zerstören" möchte, da ich diese per Bit-Verschiebung auslese.

    Mein Code für die Binär-Darstellung mit template variable

    #include <iostream>
    
    class bit {
     public:
      template<typename T>void binDisplay(T&);
      template<typename T>void hexDisplay(T&);
      template<typename T>void octDisplay(T&);
      
      template<typename T>T bitManip(char&,int&,int&);
     private:
      short size;
    };
    
    template<typename T>void bit::binDisplay(T &dual) {template<typename T>T t1; size = sizeof(T)*8; t1 = 0; for(int i = 0; i <= size;i++) { t1 = (dual >>  (size-i)) & 0x01; std::cout << t1; } }
    

    ich weiß das ich meine template-variable falsch definiere...., aber wie mache ich das richtig? Konstruktive tipps gerne willkommen.

    Die Fehlermeldung

    C:\Users\7dc62\Desktop\Untitled1.cpp	In member function 'void bit::binDisplay(T&)':
    14	52	C:\Users\7dc62\Desktop\Untitled1.cpp	[Error] a template declaration cannot appear at block scope
    14	98	C:\Users\7dc62\Desktop\Untitled1.cpp	[Error] 't1' was not declared in this scope
    

    P.S.: Mir ist die Unsitte bekannt mit der ich meinen Code formatiere und ich bin keine studierter Informatiker...



  • Lass das template<typename T> bei der Variablendeklaration weg und verwende T.



  • gelöst: ich wollte das template 2x deklarieren...
    habe es gelöst ich hatte das template schon deklariert dadurch musste ich nur noch die variable deklarieren. tut mir leid für das unnötige posten hier...

    Meine Lösung:

    #include <iostream>
    
    class bit {
    public:
     template<typename T>void binDisplay(T &dual);
     template<typename T>void hexDisplay(T &hex);
     template<typename T>void octDisplay(T &oct);
    };
    
    template<typename T>void bit::binDisplay(T &dual) { T t1; short size = sizeof(T)*8; for(int i = 0; i < size;i++) { std::cout << i << ":"; t1 = (dual >> (size-i)) & 0x01; std::cout << t1 << std::endl; } }
    


  • @Mechanics sagte in template-variable in einer methode:

    Lass das template<typename T> bei der Variablendeklaration weg und verwende T.

    danke... bin nach mehrmaligem ausprobieren draufgekommen, aber danke für die hilfe!!!!

    kann man die posts hier als gelöst selbst markieren?



  • wenn ich dem ganzen jetzt ein char zum testen gebe, kriege ich diese ausgabe hier:
    https://ibb.co/XzpfRdz



  • wenn ich dem ganzen jetzt statt einer template-variable ein bool gebe funktioniert es. hätte ich mir auch denken können...

    das nächste problem ist jetzt aber die formatierung stimmt nicht...
    https://ibb.co/tD1jmmt

    woran liegt das? ich kann das natürlich umformatieren wieder. mit einer bitverschiebung... mich würde aber interessieren woran liegt das?



  • 01100001 wäre ein 'a' bei mir wird 00110000 angezeigt... eine bitverschiebung um 1 löst das... aber warum tritt das überhaupt auf?



  • weil meine schleife bei 0 anfängt die bitverschiebung zu machen und eine verschiebung um 0 ist keine verschiebung... facepalm. ich reite mich hier immer weiter rein. lol



  • Es ist aber durchaus nicht schlecht, wie du selber weitergekommen bist. Die Frage zu formulieren ist oft schon die halbe Antwort.



  • danke :). jetzt kommt aber das nächste problem...
    ich habe folgende switch anweisung

     if(sizeof(var)*8 > iPos) { if(c == '+' || c == '-' || c == '~') {
    
      switch(c) {
       case '+': var |=  (0x01 << iPos);
       case '-': var &= ~(0x01 << iPos);
       case '~': var ^=  (0x01 << iPos);
      }
      
     return var; } }
     
     else { return var; }
    

    also in meiner variable ein bit setzen, löschen oder invertieren. nur reagiert mein programm beim bit löschen als ob ich ein bit setze...
    wo liegt mein fehler? sämtliche tutorials die ich anschaue sagen mir ich habe es richtig gemacht...



  • Da fehlen die breaks (edit: oder eben direkt jeweils ein return), so wird immer in den nächsten Zweig „durchgefallen“.



  • danke:) man so ein anfängerfehler... funktioniert jetzt perfekt.
    ich benutze nie switch-anweisungen, aber hier ist es der übersicht-halber doch ganz gut.

    danke nochmal. und mein programm ist fertig.


Anmelden zum Antworten