Ich habe eine Klasse, die eine externe Funktion in einer Vielzahl von verschiedenen Kontexten aufrufen muss. Ich mag Dinge flexibel halten, so dass ich über eine Schnittstelle (inspiriert von der 3. Ausgabe von Numerical Recipes), die mit functors, Funktionszeigern, usw. Ein vereinfachtes Beispiel sieht aus wie funktionieren soll: BisherVerknüpfungsfehler mit Vorlagenklassen
class MyClass {
public:
template <class T>
MyClass(T &f_) { f = f_; }
private:
int (*f)(int);
};
int myFn(int i) {
return i % 100;
}
int main() {
MyClass test(myFn);
return 0;
}
so gut; g ++ erstellt das ohne Beanstandungen. In meiner realen Anwendung gibt es viel mehr Code, so dass ich Dinge unter mehreren Dateien aufgeteilt habe. Zum Beispiel
test2.h:
#ifndef __test2__
#define __test2__
class MyClass {
public:
template <class T>
MyClass(T &f_);
private:
int (*f)(int);
};
#endif
test2.cpp:
#include "test2.h"
template <class T>
MyClass::MyClass(T &f_) {
f = f_;
}
main.cpp:
#include "test2.h"
int myFn(int i) {
return i % 100;
}
int main() {
MyClass test(myFn);
return 0;
}
Wenn ich versuche, dies mit g++ test2.cpp main.cpp
zu kompilieren, ich erhalten Sie den folgenden Verbindungsfehler:
/tmp/ccX02soo.o: In function 'main':
main.cpp:(.text+0x43): undefined reference to `MyClass::MyClass<int()(int)>(int (&)(int))'
collect2: ld returned 1 exit status
Es scheint, dass g ++ nicht bewusst ist, dass ich auch versuche, test2.cpp zu kompilieren. Irgendwelche Ideen, was hier vor sich geht?
Danke,
--craig
möglich Duplikat [? Warum können Vorlagen nur in der Header-Datei implementiert werden] (http://stackoverflow.com/questions/495021/why-can-templates-nur-in-the-header-file implementiert werden –