Bonjour à tous,

je rencontre un petit soucis sur de l'héritage de classe "templatisée", et j'aimerais avoir votre avis face à un problème de link.
Pour info:
- je ne souhaite pas discuter de la légitimité de ce que je fais dans le code; même si vous trouvez que mon code est pourri/inutile, ça pose tout de même une question sur le langage et sa syntaxe
- mon test fonctionne sur un compilo (Visual), mais pas sur un autre (compilateur C++ ARM d'IAR pour l'embarqué); mais il doit bien y avoir un truc normalisé C++03 là-dessus qui devrait passer sur compilo IAR (j'espère)
- les compilos évoqués dans ce message sont censés suivre C++03. Pas C++11.


Je dispose d'une classe Maman:
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
 
// Maman.cpp/.hpp
 
template<int N>
class Maman
{
public:
    Maman(const char* uneChaine);
    virtual ~Maman();
    virtual int GetValue();
};
 
template<int N>
Maman<N>::Maman(const char* uneChaine)
{
    // do something
}
 
template<int N>
Maman<N>::~Maman()
{}
 
template<int N>
int Maman<N>::GetValue()
{
    return N;
}
J'implémente une classe Fille, héritée de Maman.
Je trouve beaucoup d'exemples sur le web de classe fille elle-même templatisée. Ici ce n'est pas le cas: Fille n'est pas templatisée; mieux: elle précise de quelle "version" de Maman elle hérite (pitié, ne pas répondre des trucs du genre "ça sert à rien", ou "je ferais autrement"... le code ici est volontairement simplifié et idiot pour poser le problème technique et rechercher la solution adéquate):
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
 
// Fille.cpp/.hpp
 
class Fille : public Maman<6>
{
public:
    Fille(const char* uneChaine);
    virtual ~Fille();
};
 
Fille::Fille(const char* uneChaine):
    Maman(uneChaine)
{}
 
Fille::~Fille()
{}
Bien entendu, j'instantie une Fille:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
int main()
{
    Fille maFille("une chaine");
    maFille.GetValue();
    return 0;
}

Quand je compile.... problèmes au link (compilo IAR):
Error[Li005]: no definition for "Maman<(int)6>::Maman(const char*)"
[referenced from Fille.obj]
Error[Li005]: no definition for "Maman<(int)6>::~Maman()"
[referenced from Fille.obj]
Error[Li005]: no definition for "Maman<(int)6>::GetValue()"
[referenced from Fille.obj]

Alors comme je suis un bon gars, je me dis que je vais remettre le paramètre de template dans l'appel au constructeur de Maman présent dans la liste d'initialisation du constructeur de Fille
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
Fille::Fille(const char* uneChaine):
    Maman<6>(uneChaine)
{}

Résultat: pas mieux.

De toutes façons:
1) même si ça avait changé quelque chose pour le constructeur, le problème serait resté entier pour le destructeur... (ça aurait peut être donné une piste)
2) je serais étonné de devoir répéter la valeur du paramètre de template pour chaque méthode de Fille... et de toutes façons où est-ce que je pourrais le faire...?


A noter que dans les 2 essais d'implémentation de Fille, Visual Studio réussi à linker et me générer mon exécutable.
Avec le compilateur IAR, toujours cette satanée erreur.


Avez vous une idée?

Merci d'avance pour vos réponses!

Nicolas