Wie mache ich jede Instanz eines templates zu einem Freund von mir?



  • template</*typen*/>
    class bar;            //Vorwärtsdeklaration
    
    template</*Typen*/>
    class foo
    {
    private:
        foo(int a) {/*...*/};
    };
    
    template</*typen*/>
    class bar
    {
    private:
        foo f;
    public:
        bar(int a)
            :f(a);    //Geht natürlich nicht, da privat
    };
    

    Wie also muss die friend deklaration aussehen?



  • template<typen>
    friend bar<typen>;
    

    bin mir nicht 100% sicher, da es irgendwelche einschränkungen bei friend und templates gab,aber ich komm im moment nicht drauf welche.

    versuchs mal so, wenns funktioniert, wirds richtig sein 😃



  • 70 Errors
    Wenn ich noch "class" vor bar schreibe sinds nur noch drei:
    Das ganze sieht sieht genau genommen so aus:

    template
    <
    	class x,
    	template<class>class y
    >
    class bar;
    
    template<class T,T t>
    class foo
    {
    public:
        template<class V,class U>    //Error 1    Error 6
            friend class bar<V,U>;         //Error 3,edit
    private:
        foo(int a);
    };                               //Error 2
    
    template<class x>
    class y
    {
    };
    
    template
    <
    	class x=foo<char,'*'>,
    	template<class>class y=y
    >
    class bar
    {
    private:
        x f;                        //Error 4,edit
    public:
        bar(int a)
            :f(a);
    };                                //Error 5 in main, ich habe testweise eine Instanz von bar erstellt
    
    1 error C3857: 'bar<T1,T2>': Mehrere Vorlagenparameterlisten sind nicht zulässig
    2 Siehe Verweis auf Instanziierung der kompilierten Klassenvorlage 'foo<T,t>'
    3 error C3200: 'T2': Ungültiges Vorlagenargument für den Vorlagenparameter 'y'; Klassenvorlage erwartet
    4 Siehe Verweis auf Instanziierung der kompilierten Klassenvorlage 'foo<T,t>'
             with
             [
                 T=char,
                 t=42
             ]
    5 Siehe Verweis auf Instanziierung der kompilierten Klassenvorlage 'bar<>'
    6 error C3857: 'bar<T1,T2>': Mehrere Vorlagenparameterlisten sind nicht zulässig
    


  • mach ma beim template aus T einen beliebigen anderen buchstaben,der gcc würde mir da ein T shadows templateparameter T auswerfen

    foo f;
    

    fehlen da keine template parameter? oder gibts da nochne vorwärtsdeklaraton?



  • Ich hab noch mal editiert! Und ich hab mal V statt T versucht, -> keine Besserung



  • gcc gibt mir jetzt nurnoch 1+folgefehler(der will akzeptiert das template da net^^)hab den code so verändert:

    template<class x,template<class>class y>
    class bar;
    
    template<class T,T t>
    class foo{
        public:
            template<class T2,template<class>class U>
            friend class bar<T2,U>;         
        private:
            foo(int a);
    };                              
    
    template<class x>
    class y{};
    
    template
    <class x=foo<char,'*'>,template<class>class y=y>
    class bar
    {
        private:
            x f; 
        public:
            bar(int a):f(a){}
    };                
    int main(){
    	bar<> T(5);
    }
    

    schau ihn dir genau an, sind zum größten teil standardfehler 🙂



  • Bei mir sinds immernoch 3, wenn du das als Folgefehler ansiehst, bei mir auch. Das ist natürlich nicht ganz genau mein Code, genau genommen sind die Parameter etwas anders. Aber ich habe immer noch 2* den Fehler das mehrere Vorlagenparameter nicht erlaubt sind. und 1* das T2 nicht für y geeignet wäre??? >frust<



  • ach wie ich die suche liebe....und die syntax von C++ mit all ihren tücken und sonderfällen verabscheue:

    template<class T2,template<class>class U>
    	friend class bar;
    

    bäh. bitte neuer standard, mach das einheitlich 😞
    überall sonst muss man die template parameter mit angeben, nur hier nicht 😞



  • Otze, du bst wieder mal mein Retter! Aber verrate mir eins: was für einen Suchbegriff hast du eingegeben?



  • otze schrieb:

    template<class T2,template<class>class U>
    	friend class bar;
    

    Sicher, dass das stimmt? 😕



  • 100 pro, der gcc kompiliert das, die suche sagt das so, und google auch.

    suchbegriff: friend template 🙂



  • Das sieht mir so fernab von allem aus, was ich gültige C++ Syntax nennen würde. Kompiliert der gcc das auch auf pedantic?



  • --------------------Configuration: test - Debug--------------------
    Compiling source file(s)...
    test.cpp
    Linking...

    test.exe - 0 error(s), 0 warning(s)

    alle warnungen aktiviert, pedantic drin



  • Das wird deine Zweifel nicht beheben, aber VS 7.1 kompilierts auch.



  • otze schrieb:

    bäh. bitte neuer standard, mach das einheitlich 😞

    Bäh. Bitte otze lern vorher mehr über C++ bevor du sowas vorderst. Die Syntax *ist* einheitlich.

    Eine friend-Deklaration ist immer auch eine Deklaration (sie kann sogar die einzige Deklaration eines Typs sein). Bei dieser Deklaration darf es sich aber nunmal hier nur um die eines Primary-Templates handeln (da man friends auch gleich definieren kann, könnte man sonst lustig eine partielle Spezialisierung ohne Primary Template bauen - ups!). Und ein Primary-Template hat man schon immer ohne Template-Argument-Liste deklariert.

    Die Syntax:

    template <class T, class U, ...>
    class X<T, U, ...>
    

    steht seit je her für eine partielle Spezialisierung (Deklaration oder Definition. Eine solche hat in einer friend-Deklaration überhaupt nichts zu suchen. Partielle Spezialisierung sind immer automatisch friend, wenn ihr Primary-Template friend ist.


Anmelden zum Antworten