 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
nico Guest
|
Posted: Fri Jun 24, 2005 10:52 pm Post subject: Template : ou est l'erreur ? |
|
|
Bonjour,
Je ne comprends pas pourquoi le code suivant ne compile pas (g++ rale car il
ne trouve soit disant pas Test<int>::Test() et Test<int>::~Test() au
linkage).
//main.cpp
#include "test.h"
//marche si j'inclu le test.cpp ici
//mais ca ne me parait pas tres élégant...
int main()
{
Test<int> t;
return 0;
}
//test.h
#ifndef TEST_H
#define TEST_H
template<class T> class Test
{
public:
Test();
~Test();
};
#endif
//test.cpp
#include "test.h"
#include <iostream>
template<class T>
Test<T>::Test()
{
T t;
std::cout << "Test()n";
}
template
Test<T>::~Test()
{
std::cout << "~Test()n";
}
Merci.
Nicolas.
|
|
| Back to top |
|
 |
Nadine St-Amand Guest
|
Posted: Sat Jun 25, 2005 3:03 am Post subject: Re: Template : ou est l'erreur ? |
|
|
nico wrote:
| Quote: | Bonjour,
Je ne comprends pas pourquoi le code suivant ne compile pas (g++ rale car il
ne trouve soit disant pas Test<int>::Test() et Test<int>::~Test() au
linkage).
//main.cpp
#include "test.h"
//marche si j'inclu le test.cpp ici
//mais ca ne me parait pas tres élégant...
int main()
{
|
sans doute que ca marche quand test.cpp est compile avec le main dans le
meme fichier,
Peut-etre oublies-tu de compiler également le fichier test.cpp ?
Quelle est ta ligne de commande de compilation pour invoquer g++ ?
--
Nadine St-Amand
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
|
| Back to top |
|
 |
nico Guest
|
Posted: Sat Jun 25, 2005 10:17 am Post subject: Re: Template : ou est l'erreur ? |
|
|
Salut,
| Quote: | sans doute que ca marche quand test.cpp est compile avec le main dans le
meme fichier,
Peut-etre oublies-tu de compiler également le fichier test.cpp ?
Quelle est ta ligne de commande de compilation pour invoquer g++ ?
|
Non tout est bien compilé et linké, j'utilise le Makefilre suivant :
CXX=g++
CXXFLAGS=-pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586
-mtune=pentiumpro -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT
SRC= $(wildcard *.cpp)
OBJS= $(SRC:.cpp=.o)
EXE=3
$(EXE): $(OBJS)
@$(CXX) $^ -o $@ $(CXXFLAGS)
%.o: %.cpp
@$(CXX) -c $< $(CXXFLAGS)
main.o: main.cpp
mem.o: mem.cpp mem.h
clean:
@rm -f *.o *~ core *.core core.*
--
nico
|
|
| Back to top |
|
 |
nico Guest
|
Posted: Sat Jun 25, 2005 10:27 am Post subject: Re: Template : ou est l'erreur ? |
|
|
Salut,
| Quote: |
Essaie de trouver le message
[email]pxbfzr479af.fsf_-_ (AT) news (DOT) bourguet.org[/email] avec google groups.
Si tu as du mal avec l'id (j'ai l'impression qu'il est
bizarre)
Non c'est bon ca marche avec l'id. |
Post & document interessants en tout cas, merci.
Ca me rappelle mes problème avec l'inline, c'était le même genre de choses,
il fallait se débrouiller pour inclure la source pour que ca marche...
| Quote: | Maintenant, il y a au moins 2 compilateurs qui maintenant dipose de
export: como (qui est déjà cité dans ce message) et intel.
|
Ok.
--
nico
|
|
| Back to top |
|
 |
nico Guest
|
Posted: Sat Jun 25, 2005 10:34 am Post subject: Re: Template : ou est l'erreur ? |
|
|
Bonjour,
puisque l'on doit prévoir les types utilisés (enfin je me comprend )
| Quote: | C'est une sépcificité des templates qui est à prendre en compte.
Même si cela peut sembler étrange :
repeat after me, "I will do it anyway even though it's confusing." You
can trust me on this one.
En règle générale, mettez vos fonctions/méthodes génériques en dessous
de leur déclaration, et tout se passera bien.
|
C'est ce que ej vais finir par faire...
--
nico
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Sun Jun 26, 2005 6:33 am Post subject: Re: Template : ou est l'erreur ? |
|
|
bonjour,
<snip sur pb classique des template dans cpp>
le problème c'est qu'une fonction "template" n'est pas vraiment une
fonction, mais un modèle. Ce qui veut dire : le compilateur ne peut pas
compiler ta fonction template sans connaitre le paramètre à utiliser...
template <class T> void f(const T& a)
{
// fonction inutile, certes
++a;
}
ce code n'est pas compilable tel quel (excepté avec des compilateurs
implémentant export, ce qui n'est le cas de presqu'aucun), et donc on doit
trouver une spécification dans la même unité de compilation (le même cpp
donc). En pratique, cela t'oblige à mettre le code des fonctions modèles
dans un .h (enfin un fichier d'en-tête tu l'appelles comme tu veux) à
inclure dans le .cpp (l'unité de compilation) qui va l'utiliser.
|
|
| Back to top |
|
 |
nico Guest
|
Posted: Sun Jun 26, 2005 10:06 am Post subject: Re: Template : ou est l'erreur ? |
|
|
Bonjour,
| Quote: | ce code n'est pas compilable tel quel (excepté avec des compilateurs
implémentant export, ce qui n'est le cas de presqu'aucun), et donc on doit
trouver une spécification dans la même unité de compilation (le même cpp
donc). En pratique, cela t'oblige à mettre le code des fonctions modèles
dans un .h (enfin un fichier d'en-tête tu l'appelles comme tu veux) à
inclure dans le .cpp (l'unité de compilation) qui va l'utiliser.
|
OK merci pour la réponse, c'est ce que j'ai fais sous la forme
#ifndef TEST_H
#define TEST_H
template<class T> class Test
{
public:
Test();
~Test();
void f();
};
template<class T>
Test<T>::Test()
{
}
template<class T>
Test<T>::~Test()
{
}
template<class T>
Test<T>::f()
{
}
#endif
Pour quand même bien séparer déclaration/implémentation.
--
nico
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Sun Jun 26, 2005 12:58 pm Post subject: Re: Template : ou est l'erreur ? |
|
|
re-bonjour,
tu peux même faire :
Fichier Test.h
#ifndef TEST_H
#define TEST_H
template<class T> class Test
{
public:
Test();
~Test();
void f();
};
#endif
et fichier test.hpp (par exemple)
#include "test.h"
template<class T>
Test<T>::Test()
{
}
template<class T>
Test<T>::~Test()
{
}
template<class T>
Test<T>::f()
{
}
et dans ton .cpp où tu utilises le modèle :
#include "test.hpp"
Test<int > TestInt ;
si tu veux vraiment séparer complétement les 2.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|