2017-03-27 11 views
0

テンプレートクラスを使用して単純なスタックを作成しようとしています。あるクラスが他のクラスのコンストラクタを呼び出すときに問題があるようです。ネストされたテンプレートクラスの問題

#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; 
} 

「ノードの初期化には一致するコンストラクタがありません」というエラーがあります。上のコードに示されているように、Nodeコンストラクタは独自に動作しますが、Stackクラスを通して実行されても機能しません。ここ

+0

私はこの中で 'Node'の目的を全く見ません。なぜあなたのベクトルに 'T'を格納しないのですか? – WhozCraig

+0

うん。私はベースラインの例を行っていましたが、ノードごとに多くの機能を追加したい場合は、ノードを簡単に拡張できるように、このようにするのが最善であると考えました。 – ascar

答えて

0

あなたの問題はStack(): stack(g_MaxSize), top(0)stack(g_MaxSize)あなたはベクトルでNode Sを構築g_MaxSizeデフォルトを構築することを要求していることです。 Nodeはデフォルトで構築可能ではないので、あなたはそれを行うことはできません。

デフォルトのコンストラクタをNodeに追加して修正できます。別の方法は、デフォルトのNodestack(g_MaxSize, Node<T>(1))のようなベクトルコンストラクタに渡すことです。最後にゼロサイズのベクトルを作成し、コンストラクタ本体でreserveを呼び出して、Nodeの記憶域を構築せずに割り当てることができます。

+0

ありがとう! 'reserve'を使うのが最善の時期についての示唆はありますか? – ascar

+0

@ascarもしベクトルが何であるかを知るまでは、ベクトルのオブジェクトの構築を遅らせたい場合にのみ使用します。 – NathanOliver

1

vectorの引数には、デフォルトのコンストラクタが必要です。 Nodeには1つが欠けているため、エラーです。

+0

迅速な回答ありがとうございます! – ascar

関連する問題