[résolu][C++]Erreur de compilation

tigre_7665
[résolu][C++]Erreur de compilation

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)
fredericmazue

Dans exemple.cc tu as mis ça

template <typename T>
Exemple<T>::Exemple(){
std::cout << "ceci est un exemple" << std::endl;
} 

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:

template <typename T>
Exemple<T>::Exemple()
{
}

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

template <typename T>
Exemple<T>::Exemple(){
std::cout << "ceci est un exemple" << std::endl;
} 

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" ;)