Ce problème consiste à définir et à déclarer un modèle de fonction dans un espace de noms défini dans un fichier externe d'instanciation. Voici le plus petit exemple reproductible que je pourrais trouver. 4 fichiers suivent:Le modèle de fonction dans un espace de noms dans un fichier séparé compile bien, mais l'éditeur de liens ne le trouve pas
La déclaration de modèle de fonction dans un espace de noms nommé:
// bar.h
#include <algorithm>
namespace barspace {
template <typename Iter>
void DoSomething (Iter first, Iter last);
}
La définition du modèle de fonction dans un fichier séparé:
// bar.cpp
#include "bar.h"
namespace barspace {
template <typename Iter>
void DoSomething (Iter first, Iter last) {
typedef typename std::iterator_traits<Iter>::value_type val_t;
std::sort (first, last);
}
} // namespace barspace
L'en-tête pour le programme principal
// foo.h
#include "bar.h"
#include <vector>
Enfin, le programme principal où le modèle de fonction est appelé:
//foo.cpp
#include "foo.h"
int main() {
std::vector<double> v_d;
for (int i = 0; i < 10; i++) {
v_d.push_back (i);
}
barspace::DoSomething (v_d.begin(), v_d.end());
return 0;
}
Je compilez comme suit:
g++ -c -o bar.o bar.cpp
g++ -c -o foo.o foo.cpp
Ces fonctionnent très bien. Maintenant, pour relier:
g++ bar.o foo.o -o foobar
Et l'erreur du compilateur résultant de la référence non définie:
foo.o: In function `main':
foo.cpp:(.text+0x6e): undefined reference to `void barspace::DoSomething<__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > > >(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >)'
collect2: ld returned 1 exit status
Il y a un problème évident avec le code ne se fait disponible à partir du namespace
ou de la bar
unité de compilation.
De plus, lorsque je tente de placer la définition de DoSomething
dans l'en-tête bar.h
, comme je le ferais pour contourner les questions lors de la définition des méthodes de modèle de classe dans les fichiers .cpp séparés, je reçois la même erreur. Pouvez-vous jeter un peu de lumière sur mon erreur de liaison du compilateur?