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 LinkIch 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.