Aufteilen von C-Klassen mit Vorlagen in .hpp/.cpp-Dateien
Problem:
Kompilieren Eine Aufteilung der C-Vorlagenklasse in .hpp- und .cpp-Dateien führt zu undefinierten Referenzfehlern für Vorlagenmitglieder Funktionen.
Code:
stack.hpp:
template <typename Type> class stack { public: stack(); ~stack(); };
stack.cpp:
#include <iostream> #include "stack.hpp" template <typename Type> stack<Type>::stack() { std::cerr << "Hello, stack " << this << "!" << std::endl; } template <typename Type> stack<Type>::~stack() { std::cerr << "Goodbye, stack " << this << "." << std::endl; }
main.cpp:
#include "stack.hpp" int main() { stack<int> s; return 0; }
Antwort:
Erklärung:
Es Es ist nicht möglich, die Implementierung einer Vorlagenklasse zur Kompilierung in separate CPP-Dateien aufzuteilen. Die Header-Dateien werden nur vorverarbeitet und enthalten nicht den eigentlichen Code.
Kompilierungsprozess:
Beim Kompilieren wird der vorverarbeitete Header-Code mit der .cpp-Datei kombiniert. Für Vorlagenklassen benötigt der Compiler jedoch Informationen über den Vorlagendatentyp, um das Speicherlayout und die Methodendefinitionen zu generieren.
Problem mit separaten cpp-Dateien:
Verschieben der Methode Definitionen in einer separaten CPP-Datei ohne Instanziierung der Vorlagenklasse in der Header-Datei generieren nicht die erforderlichen Objektdateiinformationen. Daher kann der Linker die Symbole nicht finden, was zu undefinierten Referenzfehlern führt.
Alternativer Ansatz:
Um die Schnittstelle von der Implementierung zu trennen, sollten Sie erwägen, Datenstrukturen von Algorithmen zu trennen. Vorlagenklassen sollten nur Datenstrukturen darstellen. Algorithmen können in separaten, nicht auf Vorlagen basierenden Klassenbibliotheken implementiert werden, die mit den Vorlagenklassen interagieren oder diese nutzen. Dieser Ansatz ermöglicht das Ausblenden wertvoller Implementierungsdetails.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich undefinierte Referenzen, wenn ich C-Klassenimplementierungen mit Vorlagen in .hpp- und .cpp-Dateien auftrenne?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!