Zugriff in foo<X> auf non-public Member in foo<Y>



  • Hi,

    ich hab momentan ein Problem in folgender Template Klasse (vereinfachte Darstellung)

    template <class X>
    class foo
    {
    protected:
    	T bar;
    public:
    	foo(const foo& source) // (1)
    		: bar(source.bar)
    	{
    		std::cout << bar << std::endl;
    	}
    	template <class Y>
    	foo(const foo<Y>& source) // (2)
    		: bar(source.bar)
    	{
    		std::cout << bar << std::endl;
    	}
    };
    

    Wie man schnell feststellt, lässt sich der Code nicht compilieren, weil ein Fehler im ctor (2) ist. Da foo<X> und foo<Y> nunmal zwei unterschiedliche Typen sind, kann ich auch nicht in foo<X> auf non-public Elemente von foo<Y> zugreifen.
    Gibt es eine schöne und saubere Möglichkeit dies trotzdem zu tun ohne die Member public zu machen (auch public Memberfunktionen sind unerwünscht)? Mein erster Lösungsansatz war eine private nested template class, die von foo erbt. Allerdings ist damit nur der Zugriff auf protected Member möglich (was mir aber durchaus reichen würde, obwohl zusätzlich private Member noch besser wäre) und ich bekomme leichte Magenschmerzen, wenn ich mir die Sache länger betrachte. Aber vielleicht kennt jemand ja 'ne bessere Möglichkeit.



  • Hallo,
    was spricht gegen ein Template-Friend?



  • Mit friend hab ich's schon probiert, bin damit aber irgendwie nicht klar gekommen, da der GCC und MSC teilweise unterschiedliches Verhalten zeigten. Werd mich wohl im Standard mal schlau machen müssen. Wie würde denn ein Template friend in meinem Fall aussehen?



  • groovemaster schrieb:

    Wie würde denn ein Template friend in meinem Fall aussehen?

    So:

    template <class X> 
    class foo 
    { 
        template <class T>
        friend class foo;
    protected: 
        X bar; 
    public: 
    ...
    };
    


  • Mann, mann, mann! Ich glaub ich werd langsam alt. Jetzt weiss ich wenigstens wo mein Problem lag. Anstatt

    template <class T>
        friend class foo;
    

    hab ich einfach nur

    friend class foo;
    

    geschrieben. Der MSC hats problemlos geschluckt, beim GCC gabs Fehler.
    Naja, jetzt funktionierts auf jeden Fall. Thx.


Anmelden zum Antworten