y a-t-il une spécialisation partielle pour la méthode de la classe de modèle?
template <class A> void C<A, CObject>::foo() {};
5 Réponses :
Puisque la classe est le modèle, vous devez spécialiser cela:
template <class A> class C<A, CObject> { void foo() { ... } }
Je suis déjà spécialisé de classe, mais je dois exactement besoin de spécialiser la méthode :)
Si je me souviens bien, vous ne pouvez pas faire de spécialisation partielle de modèles pour les fonctions. Je ne sais pas si cela est inclus dans c ++ 0x p>
MISE À JOUR: B>
(En attente de confirmation) Comme indiqué dans les commentaires, une spécialisation partielle de modèles de fonctions est possible dans C ++ 0x. Strike> P>
Cette restriction est levée sur C ++ 0x
@ynngvedh, avez-vous une référence pour cette "mise à jour:" Note? Je n'ai pas encore entendu parler de cela. AFAIK, ils viennent de liftir des arguments par défaut - c'est-à-dire que vous pouvez avoir des arguments par défaut dans les modèles de fonctions.
@libt, pas de référence. Je viens de supposer que la norrow savait ce qu'il parlait comme je ne suis pas expert sur C ++ 0x. Quelqu'un peut-il connaître cela? Je vais mettre à jour de manière appropriée.
Si vous avez déjà une classe spécialisée, vous pouvez donner une implémentation différente de pour spécialiser la fonction membre dans Visual C ++ 2008 Vous pouvez aussi faire un modèle IT aussi: P> FOO code> dans la classe spécialisée:
template<typename A, typename B>
class C
{
template<typename T>
void foo();
template<>
void foo<CObject>();
};
Alors que la seconde est correcte, le premier est faux - vous ne pouvez pas mettre des spécialisations explicites en classe - et même si vous mettez la spécialisation du modèle dans la portée du vide de noms - si vous spécialisez un modèle, tous ses modèles joints doivent également être spécialisés. :( Donc tu dois rester avec la deuxième façon.
Donc, cela ne fonctionnera pas par exemple: Modèle
Modèle <> Modèle
Il semble d'abord ne pas être une conformité standard NO C ++ 03, mais cela fonctionne dans Visual C ++ 2008. Il ressemble à une extension C ++ 0x (14.6.5.3 Membres de spécialisations de modèle de classe).
Réponse correcte, deuxième option toujours là pour référence.
Eh bien, l'exemple dans 14.6.5.3/2 code> dans le brouillon C ++ 0X est une spécialisation partielle. Pour des spécialisations partielles, ces restrictions ne sont pas en place. Ceux-ci peuvent être mis en classe - déjà en C ++ 03. Mais dans votre cas, vous spécialisez explicitement le modèle de fonction. S'ils l'avaient fait dans leur exemple, il serait illégal ASWELL:
Modèle
Je pense qu'il y a un malentendu là-bas.
Il existe deux types de modèles: p>
Dans votre exemple, vous avez une classe de modèle, qui contient bien sûr des méthodes. Dans ce cas, vous devrez spécialiser la classe. P>
// 1- Inheritance template <class A, class B> class CBase { // Everything that does not require specialization }; template <class A, class B> class C: public CBase<A,B> // depending on your need, consider using another inheritance // or even better, composition { void foo(); // generic }; template <class A> class C<A,CObject> : public CBase<A,CObject> { void foo(); // specialized }; // 2- Friend // note the change in signature: // - now you need to pass the attributes to be changed // - the last parameter helps differentiating the overload // as there is no specialization for functions template <class A, class B> void foo(Arg1&, Arg2&, const B&); template <class A> void foo(Arg1&, Arg2&, const CObject&); template <class A, class B> class C { friend template <class, class> foo; }; // 3- Delegation // same signature as foo in (2) template <class A, class B> void bar(Arg1&, Arg2&, const B&); template <class A> void bar(Arg1&, Arg2&, const CObject&); template <class A, class B> class C { void foo() { bar(member1, member2, B()); } };
Non, il n'y a pas de spécialisation de modèle de fonction partielle en C ++ 0x à ajouter. P>
comme correctement mentionné ci-dessus, en ce qui concerne les modèles de fonctions fondamentalement 2 choses ont été effectuées: P>
Donc, comme avant, les solutions de contournement doivent être utilisées pour "émuler" Spécialisation des modèles de fonctions partielles. P>
Il y a quelques manières montrées sur d'autres réponses: Stackoverflow.com/Questtions/1501357/...