typedef aus Templateklassen als friend



  • Mich würde mal interessieren, was davon richtig ist bzw. ob überhaupt:

    struct X {};
    struct Y {};
    
    template <typename T, class U>
    class Foo
    {
        //...
    };
    
    template <typename T>
    class Bar
    {
    public:
        typedef Foo<T, X> XFoo;
        typedef Foo<T, Y> YFoo;
    };
    
    template <typename T>
    class FooNeedsAccess
    {
        friend class Bar<T>::Xfoo;
        friend class Bar<T>::YFoo;
    };
    

    Das nimmt der gcc-Compiler. Wenn ich das aber dem Visual Studio-Compiler zu fressen gebe, dann meckert er. Er möchte das lieber so:

    //... Wie oben
    template <typename T>
    class FooNeedsAccess
    {
        friend typename Bar<T>::Xfoo;
        friend typename Bar<T>::YFoo;
    };
    

    Was ist denn nun davon richtig/bzw. überhaupt erlaubt. Im Standard hab ich nur gefunden, dass man keine Template-Parameter als friend benutzen darf D.h.:

    template <typename T>
    class Foo
    {
        friend class T;
    };
    

    PS: Ich weiß, dass es bessere Lösungen gibt, aber ich bin da irgendwie drüber gestolpert :p



  • viande schrieb:

    Mich würde mal interessieren, was davon richtig ist bzw. ob überhaupt:

    Keines ist richtig. typedefs sind in einer friend-Deklaration nicht erlaubt.



  • Gut, das habe ich mir schon fast gedacht. War eh nur Faulheit, sind aber schon verbannt.


Anmelden zum Antworten