template-template parameter mit abhängigem parameter-typ
-
Okay, das klingt jetzt wild. Ist es irgendwo auch.
Folgendes Szenario:struct MyCategory_t { enum type { /* ... */ }; }; template <MyCategory_t::type enumerator> struct MyCategoryTraits; template <class CategoryStruct, template<typename CategoryStruct::type> class CategoryDataTraits> class EventBase { /* ... */ }; EventBase<MyCategory_t, MyCategoryTraits> eb;
Die Definition von eb ergibt bei mir folgenden Fehler:
error C3201: Die Vorlagenparameterliste für die Klassenvorlage MyCategoryTraits' stimmt nicht mit der Vorlagenparameterliste für den Vorlagenparameter 'CategoryDataTraits' überein
Blickt da jemand durch?
-
Ich tippe mal auf einen MSVC Bug, der GCC schluckt das problemlos: http://ideone.com/7azSx
Edit: Vielleicht könntest du den Namen im inneren template einfach weglassen?
Also:template <class CategoryStruct, template <typename> class CategoryDataTraits>
-
Nein, die Fehlermeldung hat schon Recht. In deinem Template hast du einen Nicht-Typ-Parameter, nämlich
MyCategory_t::type
.Beim Template-Template-Parameter arbeitest du hingegen mit einem Typparameter, was am
typename
zu erkennen ist:template<typename> class CategoryDataTraits
-
Nexus schrieb:
Nein, die Fehlermeldung hat schon Recht. In deinem Template hast du einen Nicht-Typ-Parameter, nämlich
MyCategory_t::type
.Beim Template-Template-Parameter arbeitest du hingegen mit einem Typparameter, was am
typename
zu erkennen ist:template<typename> class CategoryDataTraits
Jep, das Problem ist nur: wenn ich das typename weg lasse, dann habe ich zwar einen Nichttyp-Parameter, aber andererseits ist CategoryStruct::type ein abhängiger Typ und muss daher eigentlich mit typename als Typ gekennzeichnet werden. Das verträgt sich miteinander nicht, ich hab bisher noch nicht rausgefunden, wie man sowas hinbiegen kann.
Ich hab für mein Problem jetzt anders gelöst:
struct MyCategory_t { enum type { /* ... */ }; template <type enumerator> struct Traits; }; template <> struct MyCategory_t::Traits<MyCategory_t::BLAH> { /* Spezialisierung... */ }; template <class CategoryStruct> class EventBase { /* statt CategoryDataTraits<XYZ> wird CategoryStruct::Traits<XYZ> benutzt... */ };
Damit wird das Problem für mich zwar erstmal gelöst/umgangen, bleibt aber als akademisches Problem immernoch interessant