[gelöst] eine template-klasse friend einer anderen template-klasse (bei gleichem template-Typ)



  • Hallo zusammen,

    ich habe eine Klassentemplate A und ein Klassentemplate B, also

    template <class T> class A {
    private:
      A();
    }
    
    template <class T> class B {
    public:
      B();
    }
    

    Wie man sieht, kann A nicht so einfach erstellt werden, das soll nämlich nur die Klasse B machen dürfen.

    Außerdem soll nicht jede Template-Klasse vom Klassentemplate B jede Template-Klasse vom Klassentemplate A instanziieren dürfen, sondern nur Template-Klassen gleichen Typs.
    Das bedeutet also:
    Erlaubt:
    B vom Typ int darf A vom Typ int erstellen.
    Nicht erlaubt:
    B vom Typ string darf A vom Typ int erstellen.

    Wie schreibt man dies in C++?

    Schon versucht:

    template <class T> class A {
      friend class B<T>;
    }
    
    template <class T> class A {
      template <class T> friend class B<T>;
    }
    
    template <class T> class A {
      template <class T> friend class B;
    }
    

    EDIT: Unten steht die richtige Lösung dafür.



  • *delete*



  • *delete*



  • Schon versucht:

    Und was waren die jeweiligen Fehlermeldungen? typischer Fall von "geht nicht".

    Der erste Veruch war schon richtig, B muss nur sichtbar sein bevor es für A als friend deklariert werden kann:

    template <class T> class B;
    
    template <class T> class A {
    private:
      A();
    
      friend class B<T>;
    };
    
    template <class T> class B {
    public:
      B();
    };
    


  • Was hat das mit Factory zu tun? 😕

    Edit: pumuckl hat die Antwort schon gegeben... Ich war wohl etwas lange abwesend... 😉



  • pumuckl schrieb:

    Schon versucht:

    Und was waren die jeweiligen Fehlermeldungen? typischer Fall von "geht nicht".

    Ups, stimmt, Fehlermeldungen wären toll. *hust*

    Also:
    Schon versucht:

    template <class T> class A {
      friend class B<T>;
    }
    

    Fehler:
    B ist kein Template.
    Template-Argument für struct B benötigt.

    template <class T> class A {
      template <class T> friend class B<T>;
    }
    

    Fehler:
    B ist kein Template.
    Template-Argument für struct B benötigt.

    template <class T> class A {
      template <class T> friend class B;
    }
    

    Fehler:
    überdeckt Templateparameter <class T>
    Deklaration von class T

    War wohl typischer Fall von "alle möglichen Kombinationen ausprobiert, nur nicht die richtige."

    Hatte es nämlich auch schon mit Forward-Deklaration probiert 😞



  • wie gesagt, Nr 1 wäre richtig, mit Deklaration des templates B vorweg...


Anmelden zum Antworten