template<typename T>
T add(T a, T b) { return a + b; }
vous pouvez appeler cela avec tout type intégré (int, court, double, flotteur, etc.), et il instancier la fonction add
au moment de la compilation, selon le type que vous utilisez.
Notez que si vous cela en tête divisez/source, vous aurez du mal:
add.h:
template<typename T>
T add(T a, T b);
add.cpp:
template<typename T>
T add(T a, T b) { return a + b; }
main.cpp:
#include "add.h"
int a = 3;
int b = 5;
int i = add(a, b);
Lorsque vous essayez de c ompile cela, il va échouer au moment de la liaison. Voici pourquoi.
add.obj
ne fait Compiler pas instancier la méthode du modèle add
- parce qu'il n'a jamais appelé à add.cpp. La compilation main.obj
instancie la déclaration de fonction - mais pas le corps de la fonction. Donc, au moment de la liaison, il ne parviendra pas à trouver la définition de la méthode add
.
solution est de Simplest mettre tout l'ensemble de la fonction de modèle dans l'en-tête:
add.h:
template<typename T>
T add(T a, T b) { return a + b; }
et vous ne même pas besoin du fichier add.cpp du tout.
Points-virgules manquants dans la question, les réponses, partout. – aschepler
La dernière instruction n'est pas vraie. Il y a même une bibliothèque de programmation de méta modèle complète dans Boost. Les modèles sont merveilleux pour la programmation de méta. – Xeo
@aschepler: les points-virgules sont la chose la plus superflue en C++ – nils