2010-09-22 7 views
1

Je n'arrive pas à maîtriser la programmation en utilisant des modèles en C++.Programmation de modèles en C++

Considérez les fichiers suivants.

C.h

#ifndef _C_H 
#define _C_H 

template <class T> 
class C { 
public: 
    C(); 
    virtual ~C(); 
} 
#endif _C_H 

C.cpp

#include "C.h" 

template <class T> 
C<T>::C() { 

} 

template <class T> 
C<T>::~C() { 
} 

je tente instancier une instance de C dans un fichier appelé main.cpp.

#include "C.h" 

int main(int argc, char** argv) { 
    C<int> c; 
} 

Je reçois l'erreur suivante.

main.cpp undefined reference to `C<int>::C()' 

Je lance alors

g++ -o C.o C.pp 
g++ -o main.o main.cpp 

mais je reçois l'erreur

main.cpp: undefined reference to `C<int>::C()' 
main.cpp: undefined reference to `C<int>::~C()' 

Je suis sûr que ce qui a probablement une erreur évidente, mais je suis un vrai débutant à ce serait donc reconnaissant de toute aide .

Merci!

+0

Lien obligatoire: [C++ FAQ] (http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12). –

+0

Merci pour le lien, Georg. – bandini

+0

'_C_H' est [réservé] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier). – GManNickG

Répondre

5

Lors de l'utilisation de modèles, le code source doit être disponible chaque fois que le type est instancié, car sinon le compilateur ne peut pas vérifier que le code du modèle fonctionnera pour les types donnés. Le diviser en fichiers .cpp et .h ne fonctionnera pas, car les autres fichiers .cpp ne connaissent que le fichier .h.

Vous devez tout mettre dans le fichier .h ou inclure un fichier supplémentaire avec votre code d'implémentation.

+0

Merci beaucoup. Un malentendu découlant de la tentative d'apprendre le C++ à partir d'un arrière-plan en Java. – bandini

+0

+1: Il y a d'autres façons, mais pour un débutant c'est largement suffisant. –