Utiliser enum comme argument de type template en C ++
existe-il des restrictions ou des problèmes à l'aide d'un enum comme modèle (type) argument en C++?
Exemple:
enum MyEnum
{
A, B, C, D, E
};
template <typename _t>
class MyTemplate
{
public:
_t value;
void func(const _t& param) { /* .... */ }
};
//....
MyTemplate<MyEnum> MyInstance;
Mon réel problème à l'aide de MSVC++ par rapport à 2008 (SP1) sur Win32/x86 sont plusieurs erreurs de compilation (= les erreurs signalées par le compilateur), en association avec des classes à l'aide des enums en tant que modèle d'arguments. Comme mon projet n'a malheureusement devenir un peu complexe (vous pouvez considérer cela comme une erreur de conception :P), le modèle des classes d'augmenter ces erreurs sont dérivés, imbriqué et même spécialisés sur une classe avec enum paramètre du modèle.
Essayer de construire, le compilateur signale beaucoup de mal/inutile erreurs telles que "C2059: erreur de syntaxe: 'public'", dans les lignes où il y a seulement un commentaire. Beaucoup d'entre eux j'ai pu corrigé par le remplacement, dans les méthodes similaire à celle de l'exemple de la const _t& param par _t (c'est à dire la copie du paramètre), mais ni ce que je pourrais corriger toutes ces erreurs et je n'ai aucune idée pourquoi cette "aide". **Je sais, l'exemple simple ci-dessus compile w/o des erreurs.
À l'aide de int à la place de l'enum, mon projet se compile sans erreurs.
Merci d'avance pour tout conseil ou astuce!
Modifier:
Après tout, j'ai sérieusement considérer cela comme un bug du compilateur. Quand j'ai essayé de reproduire les erreurs de la simplification du code, je les ai seulement à 50 % de l'ensemble des "builds", pas très déterministe:
E. g. essayé de compiler, et il a signalé ces erreurs. Reconstruire - pas de changement. Supprimé un commentaire, pas de changement. Reconstruire - et puis: pas d'erreurs, compile bien.
J'ai déjà rencontré quelques bugs du compilateur (2 ou 3 je suppose que dans les 20k lignes de code), mais celui-ci me semble très étrange.
Des suggestions pour déterminer si c' est le compilateur?
source d'informationauteur dyp | 2010-08-14
Vous devez vous connecter pour publier un commentaire.
Oui, il y a des restrictions. Par exemple, vous ne pouvez pas utiliser un anonyme enum comme un argument de modèle en fonction de C++03
14.3.1[temp.arg.type]/2
Donc le code suivant n'est pas valide en C++03:
Il est valide en C++11.
Se référant à la question initiale:
Je n'ai pas trouvé et je ne pense pas qu'il y a de tout. C'est peut-être une mauvaise idée, car cette technique, il n'est pas utilisé très souvent, donc il y aura peut être un peu (plus) de compilateur de bugs relatifs à présent, tout comme Potatoswatter dit.
Considérons l'exemple suivant:
La sortie est:
Pour ces exemples simples, tout fonctionne bien et comme prévu et l'enum fonctionne parfaitement comme n'importe quel autre type de modèle type d'argument (= je ne vois pas de raison de problèmes).
A l'origine, j'ai présenté l'exemple de la question afin de montrer ce que je voulais dire avec cette question (enum en tant que modèle de type d'argument, montrer des usages en tant que membre ou d'une méthode de type d'argument et ainsi de suite). Afin de fournir un peu de contexte, c'est à dire pourquoi j'ai posé la question (imaginez que j'ai demandé "quels sont les problèmes de l'int"), je l'ai mentionné ces problèmes étranges de la compilation de mon projet.
Je suis désolé, je ne pouvais pas extraire un extrait de ce qui est complet en lui-même et de reproduire les erreurs, le moins que je puisse obtenir ont été 2k lignes de code découpé en 4 fichiers, d'où une "erreur de syntaxe : 'public'" et quelques autres erreur de syntaxe ont été soulevées lorsque j'ai compilé le projet, et ils semblaient /disparu dans certaines circonstances, lors de la suppression d'un commentaire ou d'une re-construction (= supprimer les fichiers intermédiaires). Malheureusement, la reconstruction de ne pas aider avec le projet d'origine, où j'ai dû remplacer une spécialisation à partir d'un type enum type int.
Donc, merci à tous pour vos conseils et astuces. Le problème de fond me semble être un bug du compilateur, ce qui rend la question un peu inutile, la réponse semble être juste "non - il n'y a pas de restrictions à l'aide d'un enum comme modèle à l'argument de type". Désolé pour la gêne occasionnée.
MSVC poignées enum (valeur) paramètres du modèle, étrangement. Les énumérations sont promus à
int
mal parfois, et les opérateurs ne sont pas définies correctement. Il semble qu'ils n'ont pas vraiment tester le moteur de template avecenum
types.Prouver que c'est un bug du compilateur est simple: mettre code valide, et observer si elle a réussi à se compile.
Votre exemple est évidemment conforme, de sorte que le problème (ou l'erreur, de toute façon) est la leur.Modifier: en y regardant de plus près, vous dire que l'exemple ne pas reproduire le bug. Ni nous, ni personne d'autre ne peut vous aider jusqu'à ce que vous produisez un exemple qui ne.