A voir également:
- Template c++
- Template qui veut gagner des millions - Forum Powerpoint
- Template calendrier excel - Télécharger - Bureautique
- Template typename t - Astuces et Solutions
- Template un gars une fille - Forum Montage vidéo
- Template indesign rapport de stage ✓ - Forum InDesign
3 réponses
overcode
Messages postés
119
Date d'inscription
jeudi 6 décembre 2007
Statut
Membre
Dernière intervention
21 octobre 2011
27
31 juil. 2010 à 19:11
31 juil. 2010 à 19:11
Salut jérome,
Le linker ne trouve pas l'implémentation des méthodes de la classe Wrapper. C'est un problème inhérent au templates : les déclarations et les définitions doivent être présentes au niveau de l'unité de traduction pour que le compilateur puise générer un code objet.
Bref, déplace le contenu du fichier wrapper.cpp vers l'entête wrapper.hpp, puis garde uniquement le fichier wrapper.hpp.
Je sais, ça va un peu à l'encontre de la compilation modulaire (décomposition .hpp et .cpp) :D
Voilà ce que ça donne :
wrapper.hpp
main.cpp
Tu peux faire ça en plus condensé :)
J'espère avoir un peu éclairci le mystère :)
Le linker ne trouve pas l'implémentation des méthodes de la classe Wrapper. C'est un problème inhérent au templates : les déclarations et les définitions doivent être présentes au niveau de l'unité de traduction pour que le compilateur puise générer un code objet.
Bref, déplace le contenu du fichier wrapper.cpp vers l'entête wrapper.hpp, puis garde uniquement le fichier wrapper.hpp.
Je sais, ça va un peu à l'encontre de la compilation modulaire (décomposition .hpp et .cpp) :D
Voilà ce que ça donne :
wrapper.hpp
#ifndef WRAPPER_H
#define WRAPPER_H
#include <iostream>
template <class T>
class Wrapper {
public :
Wrapper(T e);
~Wrapper();
T getElement();
private :
T element;
};
template <class T>
Wrapper<T>::Wrapper(T e) {
this->element = e;
}
template <class T>
Wrapper<T>::~Wrapper() {
std::cout << "destruction" << std::endl;
}
template <class T>
T Wrapper<T>::getElement() {
return element;
}
#endif
main.cpp
# include <iostream>
# include <string>
# include "wrapper.hpp"
int main() {
std::string toto = "toto";
Wrapper<std::string> * wrapper = new Wrapper<std::string>(toto);
std::cout << wrapper->getElement() << std::endl;
delete wrapper;
}
Tu peux faire ça en plus condensé :)
J'espère avoir un peu éclairci le mystère :)