Linker-Fehler 'nicht aufgelöstes externes Symbol': Arbeiten mit Vorlagen

8

Ich habe eine Template-basierte Klasse [Allotter.h & amp; Allotter.cpp]:

%Vor%

und seine Verwendung wird als [ActiveListener.h & amp; ActiveListener.cpp]:

%Vor%

Ich zeige nicht die vollständigen Definitionen, da es nicht wirklich wichtig ist. Das Problem ist, wenn ich kompiliere, alle Dateien richtig kompilieren. Die Dateien befinden sich in einem VC ++ - Projekt. Früher, als ich keinen Template-basierten Ansatz für Allotter verwendet habe, wurde alles kompiliert und verlinkt. Aber jetzt bekomme ich diesen Fehler:

%Vor%

Das Überraschende ist, dass der Konstruktor ActiveListener::ActiveListener() überhaupt keinen Bezug auf Allotter<QTcpSocket>::Allotter() herstellt. Die zweite Referenz existiert jedoch. Aber ich verstehe nicht, warum der Linker dieses externe Symbol nicht auflösen kann.

Die Build-Ausgabe kurz vor dem Auftreten der Fehler lautet:

%Vor%

Ich verstehe nicht, ob irgendetwas davon relevant ist, hauptsächlich weil das alles früher perfekt funktioniert hat. Es ist nur so, dass nach der Verwendung von Vorlagen ein Problem verursacht wird. Jede Hilfe wird geschätzt. Vielen Dank.

    
Rohan Prabhu 05.12.2009, 17:41
quelle

3 Antworten

16

Sie können Vorlagen nicht in .h- und .cpp-Dateien aufteilen. Sie müssen den vollständigen Code für die Vorlage in die .h-Datei einfügen.

    
anon 05.12.2009, 17:45
quelle
4

Im Allgemeinen gilt es als beste Vorgehensweise, Ihren Vorlagencode vollständig in Header-Dateien zu schreiben. Es gibt einen wichtigen technischen Grund dafür: Wenn Sie eine Vorlage instanziieren, muss der C ++ - Compiler Code aus dieser Vorlage generieren, die für die von Ihnen angegebenen Vorlagenparameter spezifisch ist. Wenn Ihr Vorlagencode vollständig in Ihren Kopfzeilen platziert ist, wird dies automatisch für Sie erledigt.

Es ist definitiv möglich, Vorlagencode so zu schreiben, wie Sie ihn haben, wobei die Implementierung in cpp-Dateien abgelegt wird. Wenn Sie dies tun, müssen Sie die Vorlageninstanz, die Sie verwenden möchten, explizit instanziieren.

In Ihrem Fall müssen Sie einer CPP-Datei in Ihrem Projekt die folgende Zeile hinzufügen:

%Vor%     
Aaron Klotz 06.12.2009 07:53
quelle
1

Da Sie die Vorlagenimplementierung nicht in CPP-Dateien platzieren können, sollten Sie .INL-Dateien für die Vorlagenimplementierung verwenden und sie aus den Vorlagenheadern einbeziehen.

    
rmn 05.12.2009 17:57
quelle