Voici un exemple simple: est-ce autorisé? p> p>
3 Réponses :
Selon au §14.7.3 / 1 de la norme (également mentionné dans cet Autre réponse ), les alias ne sont pas autorisés comme spécialisations explicites: ( p>
Une spécialisation explicite de l'un des éléments suivants: P>
- Modèle de fonction LI>
- Modèle de classe Li>
- Fonction membre d'un modèle de classe LI>
- Membre de données statiques d'un modèle de classe LI>
- classe membre d'un modèle de classe li>
- Modèle de classe membre d'une classe ou d'une classe de classe li>
- Modèle de fonction membre d'une classe ou d'une classe de classe li> ul>
peut être déclaré [...] p> blockQuote>
$ clang++ -std=c++0x test.cpp test.cpp:6:1: error: explicit specialization of alias templates is not permitted template <> ^~~~~~~~~~~ 1 error generated. Reference: 14.1 [temp.decls]/p3: 3 Because an alias-declaration cannot declare a template-id, it is not possible to partially or explicitly specialize an alias template.
Est-ce que Clang 3.0? Ok, je vois des pages de clangs que mon clang 2.9 ne fonctionnera pas.
Bien que la spécialisation directe de l'alias soit impossible, voici une solution de contournement. (Je sais que c'est un ancien poste mais c'est utile.)
Vous pouvez créer une structure de modèle avec un membre TECHEDEF et spécialiser la structure. Vous pouvez ensuite créer un alias qui fait référence au membre TypeDEF. P>
template <typename T> struct remote { typedef T type; }; template <> struct footype<float> : remote<bar> {}; foo<float> y; // y is a bar.
J'utilise ce truc, mais cela aide à l'avoir ici. Donc, merci de la mettre en place. Et bienvenue à Stackoverflow!
Juste après avoir écrit une longue réponse avec la solution de contournement pour cette limitation, j'ai trouvé votre réponse qui utilise le même principe. En tout cas, j'ai écrit en plus un couple de définir code> s pour rendre le code plus court. Jetez un coup d'œil si vous êtes intéressé: Stackoverflow.com/a/14050604/225186
Je pense que vous avez manqué un
à l'aide de code> instruction:
Modèle
Comment est-ce différent de
Typef FOO bar; code>?
@Kerreksb: C'est le contraire complet. Cela ressemblerait davantage à
Typef Bar Foo; code> (bien que cela ne soit pas autorisé). Dans mon exemple,
bar code> existe déjà en tant que type, et
foo code> devient un nouveau nom pour cela. (Ce que vous avez écrit équivalent à
à l'aide de bar = foo; code>, si cela aide.)
Oh je vois. Mais alors vous pourriez aussi bien demander que toute définition de classe i> à copier:
classe foo = bar; code> etc. Je ne suppose pas que c'est possible ...
à l'aide de FOO = bar; code>? (Ou
Typef Bar FOO; code> si vous préférez l'ancien style.) Je ne m'attends pas à mon exemple (si valide) pour créer un type distinct (s'il vous plaît laissez-moi savoir que je vais savoir que je vous malends).
Hmm, lisant cette réponse: Stackoverflow.com/questions/6622452/... me fait croire que cela n'est pas possible.
Intéressant. Je pensais à Copier i> la définition de type, pas seulement en aliasant, puisque j'imagine que vous devriez fournir (l'équivalent de) une définition de classe complète pour une spécialisation explicite. La réponse liée suggère en effet que les alias ne sont pas le bon outil pour le travail.
J'ai écrit quelques
définir code> S que généraliser sur la réponse d'Aotium, ici Stackoverflow.com/a/14050604/225186 < / a>
Il y a une manière légèrement indirecte. Voir Section 1.4