6 Stimmen

Erstellen eines Vorlagenklassenobjekts mithilfe eines Vorlagenkonstruktors

Ich habe Schwierigkeiten, ein Klassenobjekt aus einer Vorlagklasse zu erstellen, in der der Konstruktor auch eine Vorlage sein muss und ein Parameter akzeptieren muss, wenn das Objekt erstellt wird. Wenn ich jedoch versuche, das Objekt zu erstellen, erhalte ich eine Fehlermeldung, in der ich auf etwas verwiesen werde, das nicht existiert.

Hier ist mein Code:

using namespace std;
#include 

template 
class BinaryTree
{
public:
    BinaryTree(Node_Type);
    BinaryTree(Node_Type, Node_Type);
    BinaryTree(Node_Type, Node_Type, Node_Type);
    bool isEmpty();
    Node_Type info();
    Node_Type inOrder();
    Node_Type preOrder();
    Node_Type postOrder();

private:
    struct Tree_Node
{
    Node_Type Node_Info;
    BinaryTree *left;
    BinaryTree *right;
};

Tree_Node *root;

};

#endif

und meine .cpp:

template 
BinaryTree::BinaryTree(Node_Type rootNode) {

    root = rootNode;
    root->left = NULL;
    root->right = NULL;

}

Es gibt mehr in der .cpp, aber es sind nur andere Funktionsmember, die irrelevant sind. Mein oben gezeigter Konstruktor ist, was ich nicht zum Laufen bringen kann.

In meinem Hauptprogramm versuche ich, mein Objekt mit dem Aufruf zu deklarieren:

BinaryTree node('a');

aber wenn ich das versuche, erhalte ich eine Fehlermeldung, die besagt:

undefined reference to `BinaryTree::BinaryTree(char)'

Ich versuche jetzt seit zwei Tagen, das herauszufinden. Ich habe jedes Thema gegoogelt, an das ich denken kann, und unzählige Beispiele auf Stack Overflow und anderen Quellen gelesen, ohne Hilfe. Kann mir bitte jemand erklären, was mein Problem ist? Ich weiß, wie ich mein Projekt machen soll, und ich wäre jetzt fertig, wenn die Syntax in C ++ nicht so lächerlich wäre. Danke im Voraus!

10voto

stefaanv Punkte 13390

Vorlagencode sollte zum Zeitpunkt der Instanziierung sichtbar sein, was bedeutet, dass die Definition der Funktionen auch im Header sein muss.

6voto

Lösung: Sie können die Implementierungen der Vorlage nicht von der Kopfzeile trennen. Verwenden Sie einfach keine cpp-Datei und legen Sie die Definition in Ihrer Kopfzeile (.h-Datei) ab.

Warum? Dies liegt daran, dass cpp-Dateien zu vorkompilierten Quellen werden können, während Vorlagen zur Kompilierungszeit Objekte sind. Daher kann der Compiler nicht entscheiden, welchen Typ er verwenden soll, es sei denn, dies ist spezifiziert. Legen Sie also einfach alle Ihre Vorlagen nicht definierten Implementierungen in Ihre Kopfzeile .h-Datei.

2voto

QuentinUK Punkte 2830

Sie können die Instantiierung der Vorlage in einer anderen cpp-Datei erzwingen.

BinaryTree;
BinaryTree;
BinaryTree;

Auf diese Weise müssen nicht alle Funktionen in Headerdateien sein. Einige Leute verwenden die Erweiterung .inl für Dateien mit den Vorlagenimplementierungen. Die .inl-Datei wird also nur benötigt, wenn die Instantiierung noch nicht existiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X