Template Compile Error mit typedef und MSVC --- Compiler Bug ?



  • Hallo Leute,

    ich arbeite an einem platform-unabhängigen 3D-Game Framework.
    Leider ist mir da mit dem MSVC (VS 2008) ein Problem mit Templates untergekommen, das schon dokumentiert ist, z.B. Hier Link

    Ich poste aber gerne nochmal das Code-Snippet vom Link:

    template <typename T>
    class DefaultPolicy
    {
    public:
        T m_t;
    };
    
    template <typename T, template <class> class Policy>
    class Base : public Policy<T>
    {
    public:
        typedef Base<T, Policy> Impl;
    };
    
    // fails to compile C3200
    template <typename T>
    class Derived : public Base<T, DefaultPolicy>
    {
    public:
        typedef Base<T, DefaultPolicy > MyBase2; // <-- C3200 error is here
    
        // Typedef dient im Grunde dazu, die Nutzung der Basis-Klasse zu vereinfachen
        // Wie bspw. default-constructor
        Derived() : MyBase2 () {}
    };
    

    Ich habe in einem sehr ähnlichen Fall ein Problem mit dem typedef.
    Mit GCC kein Problem. Nachforschungen im Internet ergeben das der Comeau-Compiler wohl auch ein Problem an der Stelle hat.

    Wie löst man das jetzt Platform übergreifend?
    Hat jemand eine Ahnung wie Boost das Compiler-Problem "umschifft".

    Danke für die Hilfe



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ (auch C++0x) in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Variante 1:
    (pfui Spinne!)

    template <typename T>
    class Derived : public Base<T, DefaultPolicy>
    {
    public:
    #ifdef _MSC_VER
        typedef Base MyBase2; // ja, das geht mit MSVC (ist aber nicht standard)
    #else
        typedef Base<T, DefaultPolicy> MyBase2;
    #endif
    
        Derived() : MyBase2 () {}
    };
    

    Variante 2:
    (auch nicht ideal)

    template <typename T>
    class Derived : public Base<T, DefaultPolicy>
    {
    public:
        typedef Base<T, ::DefaultPolicy> MyBase2; // bloss doof wenn DefaultPolicy nicht global ist
                                                  // (OK, man könnte auch ::Path::To::DefaultPolicy schreiben)
    
        Derived() : MyBase2 () {}
    };
    

    Variante 3:
    (könnte ein brauchbarer Kompromiss sein)

    template <class T>
    struct MakeDefaultPolicyBase
    {
    	typedef Base<T, DefaultPolicy> type;
    };
    
    template <typename T> 
    class Derived : public MakeDefaultPolicyBase<T>::type
    { 
    public: 
    	typedef typename MakeDefaultPolicyBase<T>::type MyBase2;
    
    	Derived() : MyBase2 () {} 
    };
    

    Hat jemand eine Ahnung wie Boost das Compiler-Problem "umschifft".

    Ich nicht. Aber sag mir wenn du's herausfindest 🙂



  • Sowas wie Variante 1, habe ich schon befürchtet.

    Bei ausprobieren von Variante 2 ist mir der MSVC reproduzierbar abgestürzt. (Mein Fall ist ja leider noch komplexer als das Beispiel hier.)

    An Variante 3 hab ich bisher noch gar nicht gedacht, werde ich direkt mal ausprobieren.


Anmelden zum Antworten