2017-03-27 5 views
0

Ich versuche, einen einfachen Stapel mit Template-Klassen zu erstellen. Es scheint ein Problem zu geben, wenn eine Klasse den Konstruktor der anderen Klasse aufruft.Problem mit verschachtelten Template-Klassen

#include <iostream> 
#include <vector> 


int g_MaxSize = 100; 
template <class T> 
class Stack; 

template <class D> 
class Node 
{ 
private: 
    D data; 
public: 
    Node(D value): data(value) 
    { 
    } 
    template <class T> 
    friend class Stack; 
}; 

template <class T> 
class Stack 
{ 
private: 
    std::vector<Node<T>> stack; 
    int top; 
public: 
    Stack(): stack(g_MaxSize), top(0) 
    { 
    } 

    void push(T val) 
    { 
     // make sure stack isnt full 

     stack[top++]= Node<T>(val); 
    } 

    Node<T> pop() 
    { 
     return stack[top--]; 
    } 

    Node<T> peek() 
    { 
     return stack[top]; 
    } 
}; 

int main() { 

    Node<int> testNode(1) // *this works* 
    Stack<int> myStack; 
    myStack.push(3); 

    return 0; 
} 

Der Fehler ist "Kein übereinstimmender Konstruktor für die Initialisierung von 'Node'". Wie im obigen Code gezeigt, funktioniert der Node-Konstruktor eigenständig, funktioniert jedoch nicht, wenn er über die Stack-Klasse ausgeführt wird.

+0

Ich sehe den Zweck von 'Node' in diesem überhaupt nicht. Warum speichern Sie nicht einfach "T" in Ihrem Vektor ?. – WhozCraig

+0

Ja. Ich habe gerade ein Basisbeispiel gemacht, aber ich dachte, es wäre das Beste, es so zu machen, dass es einfach ist, den Knoten zu erweitern, wenn ich mehr Funktionalität für jeden Knoten haben möchte. – ascar

Antwort

0

Ihr Problem hier ist, dass stack(g_MaxSize) in Stack(): stack(g_MaxSize), top(0) beantragt, dass Sie g_MaxSize Standard Node s im Vektor konstruiert konstruieren. Sie können das jedoch nicht tun, da Node nicht standardmäßig konstruierbar ist.

Sie können Node einen Standardkonstruktor hinzufügen, der das korrigiert. Ein anderer Weg wäre, einen Standard Node an den Vektorkonstruktor wie stack(g_MaxSize, Node<T>(1)) zu übergeben. Schließlich können Sie den Vektor mit der Größe 0 erstellen und dann reserve im Konstruktor-Body aufrufen, um den Speicher für die Nodes zuzuweisen, ohne sie zu konstruieren.

+0

Danke! Irgendwelche Vorschläge darüber, wann es am besten wäre, "Reserve" zu verwenden? – ascar

+0

@ascar Ich würde es nur verwenden, wenn Sie die Konstruktion der Objekte in den Vektor verschieben möchten, bis Sie wissen, was sie sein werden. – NathanOliver

1

Das Argument vector benötigt einen Standardkonstruktor. Node fehlt eine, daher der Fehler.

+0

Danke für die schnelle Antwort! – ascar

Verwandte Themen