Heim > Backend-Entwicklung > C++ > Warum erhalte ich undefinierte Referenzen, wenn ich C-Klassenimplementierungen mit Vorlagen in .hpp- und .cpp-Dateien auftrenne?

Warum erhalte ich undefinierte Referenzen, wenn ich C-Klassenimplementierungen mit Vorlagen in .hpp- und .cpp-Dateien auftrenne?

Barbara Streisand
Freigeben: 2024-12-28 05:48:15
Original
799 Leute haben es durchsucht

Why Do I Get Undefined References When Separating Templated C   Class Implementations into .hpp and .cpp Files?

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();
};
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

main.cpp:

#include "stack.hpp"

int main() {
    stack<int> s;

    return 0;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage