J'ai créé un exemple ci-dessous pour illustrer le problème que je rencontre. Fondamentalement, quand je sépare une classe de modèle dans un fichier séparé .h/.cpp, j'obtiens des symboles non résolus pour le constructeur. En utilisant un seul fichier, il compile bien. Qu'est-ce qui cause ça?La séparation d'une classe de modèles en plusieurs fichiers génère des problèmes de liaison
fruits.cpp:
#include "apple.h"
class FruitsDB {
public:
void addApple();
};
void FruitsDB::addApple() {
Apple<int> m;
}
int main() {
FruitsDB fruits;
return 0;
}
apple.h:
template <typename T>
class Apple {
public:
Apple();
~Apple();
};
apple.cpp
template <typename T>
Apple<T>::Apple() {
}
template <typename T>
Apple<T>::~Apple() {
}
Cela produit l'erreur du compilateur:
g++ -c -o fruits.o fruits.cpp
g++ -c -o apple.o apple.cpp
g++ -Wall -ggdb fruits.o apple.o -o fruits
Undefined symbols:
"Apple<int>::Apple()", referenced from:
FruitsDB::addApple() in fruits.o
"Apple<int>::~Apple()", referenced from:
FruitsDB::addApple() in fruits.o
ld: symbol(s) not found
Je pensais que c'était mon code qui causait le problème, mais la consolidation des fichiers ne pose pas de problème. Je suppose que j'ai besoin d'inclure un fichier quelque part où je ne suis pas. Je suis totalement perdu.
Note: Ajout template <> Apple<int>::Apple() {}
dans apple.cpp va résoudre ce problème, mais j'utilise des modèles pour éviter d'avoir à écrire tous les constructeurs, etc.
http://stackoverflow.com/search?q=template+header+[c%2B%2B] – wilhelmtell