considérant toujours que l'en-tête suivant, contenant ma classe basé sur un modèle, est inclus dans au moins deux fichiers .CPP
, ce code compile correctement:spécialisation de modèle d'une seule méthode d'une classe basé sur un modèle
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 méthode de spécialisation. Il est nécessaire que le code ne comporte pas d'erreur de liaison (dans VS2008 est LNK2005) car la méthode est définie plus d'une fois. Je comprends cela car AFAIK une spécialisation de modèle complet est la même chose qu'une définition de méthode simple.
Alors, comment puis-je supprimer ce inline
? Le code ne doit pas être dupliqué à chaque utilisation. J'ai cherché Google, lu quelques questions ici dans SO et essayé beaucoup de solutions suggérées mais aucun n'a été construit avec succès (du moins pas dans VS 2008).
Merci!
Pourquoi voulez-vous supprimer l'inline? Trouvez-vous cela esthétiquement déplaisant? Pensez-vous que cela change la signification de votre code? –
Parce que si cette méthode devait être "longue" et utilisée dans beaucoup d'endroits, j'obtiendrais son code binaire copié partout, n'est-ce pas? J'ai essayé d'expliquer ceci dans la question mais je suppose que ce n'était pas clair ... :) – Chuim
@Martin: Que faire si l'implémentation a besoin de beaucoup d'autre code qui doit alors être inclus par cet entête au lieu du fichier cpp? – sbi