OVH Cloud OVH Cloud

héritage à partir d'un template

13 réponses
Avatar
LaFleche
Bonjour,

J'ai une classe générique A<> et je souhaite déclarer une classe B qui
hérite de l'instance A<int>.

Evidenment y'a une couille dans le potage quelque part puisque g++
m'insulte à l'édition de lien.

Je ne sais pas du tout d'où viens le problème et google n'est plus mon
ami depuis ce jour :(.


J'ai donc la classe A<> (A.h et A.cc) et la classe B (B.h et B.cc).

voici mes fichiers :

***** A.h *****
#ifndef A_h
#define A_h

template<typename T>
class A
{
public :
A();
virtual ~A();

virtual void foo();
};

#endif
****/A.h *****

***** A.cc *****
#include "A.h"

template<typename S>
A<S>::A(){}

template<typename S>
A<S>::~A(){}

template<typename S>
void A<S>::foo(){}
*****/A.cc *****


***** B.h *****
#ifndef B_h
#define B_h

#include "A.h"

class B : A<int>
{
public :
B();
virtual ~B();

virtual void foo();
};

#endif
*****/B.h *****

***** B.cc *****

#include "B.h"

B::B(){}
B::~B(){}

void B::foo(){}
*****/B.cc *****

La compilation séparé ne produit pas d'erreur, c'est à l'édition de lien
qu'il y à un problème.


Le message de gcc :
g++ -Wall -c Main.cc
g++ -Wall -c A.cc
g++ -Wall -c B.cc
g++ Main.o A.o B.o -o run
B.o(.text+0xd): In function `B::B[not-in-charge]()':
: undefined reference to `A<int>::A[not-in-charge]()'
B.o(.text+0x2d): In function `B::B[in-charge]()':
: undefined reference to `A<int>::A[not-in-charge]()'
B.o(.text+0x56): In function `B::~B [not-in-charge]()':
: undefined reference to `A<int>::~A [not-in-charge]()'
B.o(.text+0x90): In function `B::~B [in-charge]()':
: undefined reference to `A<int>::~A [not-in-charge]()'
B.o(.text+0xca): In function `B::~B [in-charge deleting]()':
: undefined reference to `A<int>::~A [not-in-charge]()'
collect2: ld returned 1 exit status


Remarquez que la methode foo(), redéfinie dans B, ne semble pas lui
poser de problème, ce sont les destructeur et les constructeurs qui le
chagrine.

Merci de votre aide.

3 réponses

1 2
Avatar
Gabriel Dos Reis
drkm writes:

| James Kanze writes:
|
| > drkm writes:
|
| [...]
|
| > |> Je n'arrive pas à voir le problème si on utilise les include
| > |> guards qui vont bien. Y a-t-il réellement une contre-indication
| > |> spécifique ?
|
| > C'est vrai qu'avec l'utilisation des gardes classiques, il ne doit pas y
| > avoir de problème. Mais bon, le poster original n'en avait pas. Et je
| > n'en ai jamais vu non plus dans le code que je maintiens.
^^^^^^^^^
|
| Tiens. Je pensais que ce faisait partie du BABa. J'ai eu un doute,
| et j'ai vérifié dans la gabi-lib, tu les utilises bien, Serge

mais il est probable que James ne maintient pas le code dans la gabi-lib.
;-)

-- Gaby
Avatar
kanze
drkm wrote in message
news:...
James Kanze writes:

drkm writes:


[...]

|> Je n'arrive pas à voir le problème si on utilise les include
|> guards qui vont bien. Y a-t-il réellement une contre-indication
|> spécifique ?

C'est vrai qu'avec l'utilisation des gardes classiques, il ne doit
pas y avoir de problème. Mais bon, le poster original n'en avait
pas. Et je n'en ai jamais vu non plus dans le code que je maintiens.


Tiens. Je pensais que ce faisait partie du BABa.


Il y a certainement quelque chose qui s'est perdu dans mes pensées là.
Évidemment, j'utilise réligieusement des gardes d'inclusion ; elles sont
aussi présentes dans prèsque tout le code que je vois chez les clients,
et dans les rares cas où elles manquent, je les ajoute.

Je suppose que je pensais en fait que je n'ai jamais vu le .cc qui
contenait la définition des templates comporter un #include du .hh. Mais
je ne suis plus sûr.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Gabriel Dos Reis wrote in message
news:...

mais il est probable que James ne maintient pas le code dans la
gabi-lib. ;-)


Actuellement, en fait, non, et je ne sais pas combien de temps il serait
encore disponible.

J'espère avoir une nouvelle site sous peu.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

1 2