96 votes

Modèle de spécialisation d'une méthode unique d'basé sur un modèle de classe

Toujours en considérant que l'en-tête suivant, contenant mon basé sur un modèle de la classe, est inclus dans au moins deux .CPP fichiers, ce code compile correctement:

template <class T>
class TClass 
{
public:
 void doSomething(std::vector<T> * v);
};

template <class T>
void TClass<T>::doSomething(std::vector<T> * v) {
 // Do somtehing with a vector of a generic T
}

template <>
inline void TClass<int>::doSomething(std::vector<int> * v) {
 // Do somtehing with a vector of int's
}

Mais notez la ligne dans la spécialisation de la méthode. Il est nécessaire pour que le code ne pas avoir de liens d'erreur (dans VS2008 est LNK2005) en raison de la méthode définie plus d'une fois. Je comprends cela, car autant que je sache, un modèle complet de spécialisation est la même qu'une simple définition de la méthode.

Alors, comment puis-je supprimer qu' inline? Le code ne doit pas être dupliqué dans chaque utilisation. J'ai cherché sur Google, de lire quelques questions ici, dans la et essayé beaucoup de solutions proposées, mais aucune n'a été construit avec succès (au moins pas dans VS 2008).

Merci!

73voto

maxim1000 Points 3718

Comme avec des fonctions simples que vous pouvez utiliser de déclaration et de mise en œuvre. Mettre dans votre en-tête de la déclaration:

template <>
void TClass<int>::doSomething(std::vector<int> * v);

et de mettre en œuvre dans l'une des prestations du rpc-fichiers:

template <>
void TClass<int>::doSomething(std::vector<int> * v) {
 // Do somtehing with a vector of int's
}

N'oubliez pas de retirer inline (j'ai oublié et de la pensée, cette solution ne fonctionnera pas :) ). Vérifié sur VC++2005

4voto

BostonLogan Points 1067

Vous avez besoin de déplacer la spécialisation définition d'un fichier CPP. La spécialisation de la fonction membre de la classe de modèle est permis, même si la fonction n'est pas déclaré en tant que modèle.

3voto

Loki Astari Points 116129

Il n'y a aucune raison de supprimer le mot-clé inline.
Il ne change pas le sens du code de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X