2012-04-11 20 views
0

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

+0

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 –

Antwort

1

Template-Klassen müssen ihre Umsetzung sichtbar für alle Übersetzungseinheiten haben, die sie verwenden, sofern sie nicht vollständig spezialisiert sind.

Das heißt, Sie haben die Umsetzung in der Kopfzeile bewegen:

//test2.h 
#ifndef __test2__ 
#define __test2__ 

class MyClass { 
    public: 
    template <class T> 
    MyClass(T &f_);  
private: 
    int (*f)(int); 
}; 

template <class T> 
MyClass::MyClass(T &f_) { 
    f = f_; 
} 

#endif 
Verwandte Themen