Bonjour,
Je suis en train d'écrire une classe modèle, que je souhaite pouvoir spécialiser.
Je suis sous QTCreator (MinGW 5.3.0 32) avec C++17 activé (config += C++17).
EnumType.huser.h(module utilisateur)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 template <typename Enum> // Classe de contenu struct EList { Enum val; std::string str; }; template <typename Enum, class EnumList/*=EList<Enum>*//* retiré car un moment j'ai cru que c'était la cause*/> class TEnumType // classe modèle visée { ... protected: static const std::vector<EnumList> liste; ... }; // pour les tests template <typename Enum> using TEnumTypeDef = class TEnumType<Enum,EList<Enum>>;Message modifié assez lourdement.. Veuillez m'en excuser si vous m'avez déjà lu... Tout était faux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 //--------------------------------------------------------------------------- enum class EType : int { ... }; //--------------------------------------------------------------------------- class TEnregistrement; // forward... struct tt { EType t; string str; const TEnregistrement *base; }; // Spécialisation de EnumType pour EType et tt, introduisant une fonction nouvelle template<> class TEnumType<EType,tt> { public: static string CommaTypes(){ // faire un truc... et renvoyer une chaine } }; //--------------------------------------------------------------------------- // Fonction pour tester le tout. void f() { TEnumTypeDef<EType> test2; decltype(test2)::liste; // Message indiquant que liste est protégé (fait exprès pour avoir ce message) TEnumType<EType,tt> test; decltype(test)::liste; // Ici, message indiquant que liste n'est pas déclaré !?!. } //---------------------------------------------------------------------------
En fait, la spécialisation de mon template se conduit comme si je créais une nouvelle classe... Je n'ai pas trouvé cela dans les docs (pour moi spécialisation signifie modifier certaines parties, mais pas tout annuler).
Devrais-je donc faire un copier/coller de tous les éléments de ma classe modèle que je souhaite garder(pas très pratique tout ça)?
Aurais-je commis une bourde quelque part?
Ce comportement peut-il être vu avec d'autres compilateurs, ou bien est-ce lié à ma version?
Toute information est la bienvenue,
par avance merci à ceux qui auront eu le courage de me (re)lire!
A bientôt!
Partager