OVH Cloud OVH Cloud

Debutant Template

6 réponses
Avatar
Olivier
Je travaille sous BCB6




vola ce que j'ai ecris :

le H
template <class T>

class A{

public:
A();
~A();
void f();
};

le CPP
template<class T>A<T>::A()
{
cout<< contructeur<<endl;
}

template <class T>A<T>::~A()
{
// bla bla
}
template<class T> void A<T>::f()
{
// bla
}

et sur un autre fichier Main.cpp je fais

class B{};

#pragma argsused
int main(int argc, char* argv[])
{
A *p =new <B>A(); ou cela mais cela plante A *p =new A<B>();
p->f();
delete p;
return 0;
}

les erreur sont
[C++ Erreur] Main.cpp(12): E2102 Impossible d'utiliser le modèle 'A<T>' sans
spécifier des paramètres de spécialisation
[C++ Erreur] Main.cpp(12): E2040 Déclaration terminée incorrectement

ou est mon erreur ?
comment apeeler cette classe

est t il possible de de tester le type de "class T" si oui comment ?

merci de vos reponses

Cordialement ,
Sarda Olivier

Site Web:
http://membres.lycos.fr/osarda

6 réponses

Avatar
Fabien LE LEZ
On Sat, 18 Oct 2003 15:42:38 +0200, "Olivier"
wrote:

template<class T>A<T>::A()


Ceci va aussi dans le template.
Je te conseille fortement de mettre le lien
<http://www.google.com/advanced_group_search?hl=en> dans tes
bookmarks...

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Christophe Lephay
Olivier wrote:
A *p =new <B>A(); ou cela mais cela plante A *p =new A<B>();


A< B > * p = new A< B >;

Chris

Avatar
Olivier
Salut
j'essaie d'appeler ma fonction f() par rapport a mon premier post


template <class T>

class A{
public:
A();
~A();
void f();
};

code dans le Main()

A<B> *p =new A<B>();
p-><B>f(); // erreur [C++ Erreur] Main.cpp(17): E2280 Identificateur de
membre attendu
delete p;

ou est mon erreur ?


et je si je fais
p->f();

voila les erreurs
[Lieur Erreur] Unresolved external 'A<B>::~A<B>()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ
[Lieur Erreur] Unresolved external 'A<B>::A<B>()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ
[Lieur Erreur] Unresolved external 'A<B>::f()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ

dur dur les templates

peut tu me repondre pour cette solution ?

mercie encore


--
Cordialement ,
Sarda Olivier

Site Web:
http://membres.lycos.fr/osarda
Avatar
Fabien LE LEZ
On Sat, 18 Oct 2003 22:14:50 +0200, "Olivier"
wrote:

A<B> *p =new A<B>();
p-><B>f(); // erreur [C++ Erreur] Main.cpp(17): E2280 Identificateur de
membre attendu


Enlève le <B>.

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Alexandre
template <class T>

class A{
public:
A();
~A();
void f();
};

code dans le Main()

A<B> *p =new A<B>();
p-><B>f(); // erreur [C++ Erreur] Main.cpp(17): E2280 Identificateur de
membre attendu
delete p;

ou est mon erreur ?


p->f();



et je si je fais
p->f();

voila les erreurs
[Lieur Erreur] Unresolved external 'A<B>::~A<B>()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ
Il faut définir le destructeur de A :

template <class T> A::~A() {}
ou alors ne pas le déclarer dans la classe

[Lieur Erreur] Unresolved external 'A<B>::A<B>()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ
Idem. Il faut définir ton constructeur (lui donner un code, quoi)


[Lieur Erreur] Unresolved external 'A<B>::f()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ
Encore idem.



dur dur les templates
Mais non. Pas tant que cela.

Pour faire un template le plus simple c'est que tu fasses une classe
"normale" en utilisant des types T qui -dans un premier temps- peuvent être
de simples typedef, tu essaies, et après tu enlève ton typedef et tu fous
des template <class T> un peu partout ;-)



peut tu me repondre pour cette solution ?

mercie encore


--
Cordialement ,
Sarda Olivier

Site Web:
http://membres.lycos.fr/osarda






Avatar
Christophe Lephay
Olivier wrote:
template <class T>

class A{
public:
A();
~A();
void f();
};

code dans le Main()

A<B> *p =new A<B>();
p-><B>f(); // erreur [C++ Erreur] Main.cpp(17): E2280 Identificateur
de membre attendu
delete p;

ou est mon erreur ?


et je si je fais
p->f();

voila les erreurs
[Lieur Erreur] Unresolved external 'A<B>::~A<B>()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ
[Lieur Erreur] Unresolved external 'A<B>::A<B>()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ
[Lieur Erreur] Unresolved external 'A<B>::f()' referenced from
E:OLIVEPROJETSCPPBCB6TESTTESTTERMPLATESMAIN.OBJ

dur dur les templates


La bonne syntaxe est p->f();

Les erreurs que tu obtiens sont liées à une spécificité des templates : il
faut aussi que le fichier de définition soit inclu au point d'instanciation.
En d'autres termes, il faut inclure A.cpp et pas seulement A.h avant ton
main() (ou quelque soient leurs noms)...

Chris