Bonjour,
A la compilation de mon programme, j'obtiens ce message :
g++ -o exemples.o -c exemples.cc -W -Wall -g exemples.cc:7: erreur: redefinition of ‘Exemple<T>::Exemple()’ exemples.tpp:4: erreur: ‘Exemple<T>::Exemple()’ previously declared here make: *** [exemples.o] Erreur 1
Que faut-il que je modifie ou ajoute pour que mon programme fonctionne?
Merci
Voici les différents fichier et le Makefile
// exemple.hh #ifndef EXEMPLE_HH #define EXEMPLE_HH template <typename T> class Exemple { public: Exemple(); }; #include "exemples.tpp" #endif
// exemple.tpp template <typename T> Exemple<T>::Exemple() { }
//exemples.cc #include <iostream> #include "exemples.hh" template <typename T> Exemple<T>::Exemple(){ std::cout << "ceci est un exemple" << std::endl; } int main(){ Exemple<int> ex; return 0; }
CC=g++ CFLAGS=-W -Wall -g LDFLAGS=-W -Wall -g EXEC=exo all: $(EXEC) exo: exemples.o $(CC) -o exo exemples.o $(LDFLAGS) exemples.o: exemples.cc $(CC) -o exemples.o -c exemples.cc $(CFLAGS) clean: rm -rf *.o mrproper: clean rm -rf $(EXEC)
Dans exemple.cc tu as mis ça
Pour le compilateur c'est pareil que que ce qu'il voit dans exemple.cpp (je mets exemple.cpp, parce que exemple.tpp me déplait ;) :) ) c'est à dire:
Pour lui qu'il y ait std::cout dans l'un et pas dans l'autre ça ne change rien. Il voit une redéfinition du constructeur et il râle.
Remède:
- tu vires totalement la redéfinition de exemple.cpp
- dans exemple.cpp (pas .tpp :) ) tu mets
C'est à dire qu'il y avait dans exemple.cpp
Et ça ira.
Maintenant une remarque.
Tu écris une classe générique qui ne fait rien de son type générique. Cela n'a pas grand sens. Je suppose que tu vas dire que tu t'entraînes. Mais dans ce cas je te propose de t'entraîner à sortir le type paramétré avec ton std::cout, plutôt que de sortir "ceci est un exemple" ;)