Bonjour à tous,
Je réalise un code sur deux fichiers d'entête séparés. A.hpp et B.hpp. Comme l'indique le titre du sujet, A a besoin de B et B a besoin de A.
Dans un cas normal, je dirais, pas de soucis ; je créé les mêmes en *.cpp et le tour est joué. Mon problème ici c'est que j'ai des classes templates et des fonctions membres templates. Donc si je fait des définitions dans un fichier *.cpp, je vais être obligé de définir les templates pour chaque type que je souhaite utiliser. Il est hors de question que je fasse le boulot que les templates sont justement sensées faire.
Mon code commence a avoir une certaine complexité (à mon niveau), et j'en ai un peu marre de tester les différentes solutions possibles pour réussir à faire fonctionner les templates buguées de C++ (oui, soyez honnêtes, l'idée des templates est bonne mais leur utilisation est quand même mal foutue).
C'est grandement simplifié, mais voici la forme du code :
Alors j'ai bien-entendu essayé de faire des déclarations anticipées dans les deux headers, mais évidement "invalid use of incomplete type". Si je réalise les définitions dans des *.cpp séparés, j'ai des "undefined reference to Name::foo<T> etc..." parce que je n'ai pas envie d'obliger l'utilisateur (moi-même en l’occurrence) de devoir spécialiser le template pour chaque type que je vais utiliser (on utilise les templates pour éviter ça justement non ?) sur toute la palanquée de fonctions templatées de mes classes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 ///// Name.hpp template<typename T> class Name { private: Company nComp; public: template<typename C> void foo() { //[...]; } }; ///// Company.hpp class Company { private: public: template<typename T> Name<T> & foo() { //[...]; } };
Quelqu'un saurait m'aiguiller sur une solution ? Je peux fournir le code complet si besoin mais je pense que les quelques lignes ci-dessus représentent bien l'idée générale.
Merci d'avance !
Désoler pour ce message un peu direct, mais ce genre de blocages liées à la viscosité de ce langage ont tendance à m'irriter![]()
Partager