Bonjour,

Je me demande où, idéalement, se place le code de spécialisation d'une classe template.
Voyons un exemple. J'ai une classe template :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
// Fichier ClasseBidule.h
template<class T>
class Bidule {
    void uneFonction(void);
    T t;
};
 
template<class T>
void uneFonction(void) {
    // du code générique ici
}
et une classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
// Fichier ClasseA.h
class A {
    // des machins
};
Je souhaite spécialiser la méthode uneFonction<A>(void).
  • Le fichier ClasseBidule.h général ne connaît pas (et à mon avis, n'a pas à connaître) la classe A.
  • De même, le fichier ClasseA.h ne devrait pas include d'office la définition de la classe Bidule, si par exemple l'utilisation des deux classes et rare.
  • Mettre la spécialisation dans un fichier à part demande à l'utilisateur d'être au courant qu'il y a un cas spécial, qui sera donc probablement oublié.
  • Une inclusion conditionnelle dans ClasseA.h si la classe Bidule existe pose le problème de l'ordre d'inclusion des fichiers d'en-tête

Au final, le mieux auquel je pense est une inclusion conditionnelle d'un troisième fichier ClasseBidulePourA.hpp dans les 2 fichiers ClasseA.h et ClasseBidule.h.
Il reste comme petit problème le fait que la maintenance de ces deux fichiers est maintenant reliée (si je change le #define indiquant que ClasseA.h est inclu, je doit penser à mettre à jour ClasseBidule.h, et vice versa). Cela reste un moindre mal.

Connaissez vous d'autres/de meilleurs moyens pour faire cela ?