Zuweisungsoperator in Templateklasse



  • Hallo,

    ich habe folgenden Code:

    #include <iostream>
    #include <stdio.h>
    
    typedef unsigned long uint32_t;
    
    using namespace std;
    
    template< typename T, T >
    class TCTypeCapsule
    {
    private:
      T number;
    
    public:
      TCTypeCapsule(T i)
      {
        number = i;
        cout << i << endl;
      }
    
      // hier liegt das Problem
      TCTypeCapsule<T,T>& operator=(const TCTypeCapsule<T,T>&)
      {
        return number;
      }
    };
    
    typedef TCTypeCapsule< uint32_t, 0> EmployeeId_t;
    typedef TCTypeCapsule< uint32_t, 1> ProjectId_t;
    
    int main()
    {
      uint32_t employeeId(10);
      uint32_t projectId(12);
      employeeId = projectId;
      cout << employeeId << endl;
      EmployeeId_t employeeId_(10);
      ProjectId_t projectId_(12);
      //employeeId_ = projectId_;
    
      return 0;
    }
    

    Ich möchte nun den Zuweisungsoperator implementieren, aufgrund von Verständnisschwierigkeiten bezüglich templates fällt mir das aber ziemlich schwer und ich bekomms net hin. Hoffe ihr könnt mir helfen 🙂

    Gruß, Stephan


  • Mod

    zco schrieb:

    template< typename T, T >
    

    Der zweite Parameter hier ist ein non-type Parameter, dem du allerdings keinen Namen gegeben hast. Das passt dann aber nicht zu der Deklaration
    TCTypeCapsule<T,T>
    wie du sie später verwendest. Der Zuweisungsoperator selbst funktioniert in Templateklassen so, wie er es auch in gewöhnlichen Klassen tut.



  • Übrigens ist kannst du TCTypeCapsule (den Templatenamen ohne Parameter) innerhalb der Klassendefinition als Alias für den qualifizierten Templatenamen verwenden.



  • ok, erstma vielen dank für die schnelle Antworf. Ich habe jetzt also

    // hier liegt das Problem
      TCTypeCapsule<T,T>& operator=(const TCTypeCapsule<T,T>&)
      {
        return number;
      }
    

    durch

    // hier liegt das Problem
      TCTypeCapsule<typename T,T>& operator=(const TCTypeCapsule<typename T,T>&)
      {
        return number;
      }
    

    ersetzt. Jetzt kommen aber folgenden Fehler bei der Compilierung:

    a1.cpp:21: error: parse error before `,' token
    a1.cpp:25: error: parse error before `}' token
    

    Liegt das daran, das der return-Typ T und nicht TCTypeCapsule ist? Wenn ja, wie kann ich das ändern, wenn nein, dann, äh, tja woran liegt das dann 😕



  • So, ich habe jetzt entsprechend der Aufgabenstellung den Typen des zweiten Template-Parameters in int geändert. Wird ja, wie in Zeile 26 und 27 zu sehen nur 0 oder 1 zur Unterscheidung übergeben.

    Trotzdem ist mir das mit dem Zuweisungsoperator noch nicht ganz klar, da ich noch nicht weiß ob und wie ich den richtigen Typen angebe und warum die Fehlermeldungen kommen.



  • Richtig ist er so:

    TCTypeCapsule& operator=(TCTypeCapsule const& other)
    {
        if (&other != this) // Selbstzuweisung abfangen
            this->number = other.number;
        return *this;
    }
    

    Bzgl. der Typen siehe mein vorheriges Posting. Schau dir am Besten nochmal in einem Buch die Syntax für Klassen- und Methodentemplates an.



  • Vielen Dank, es funktioniert.

    Im Vorlesungsskript steht zwar der Funktionsaufbau, aber leider (zumindest für mich) nicht so genau drin. Aber ich werde mir noch mal ein Buch nehmen 🙂


Anmelden zum Antworten