2017-07-14 3 views
-5

私はこのコードを2つの異なるクラスで同じテンプレートを使用しようとしています。私はコンパイルするとき、私はエラーを取得:異なるクラスに同じテンプレートを使用できないのはなぜですか?

#include <iostream> 
#include <memory> 

template <class T> 
class Node 

{ 
    public: 
    int value; 
    std::shared_ptr<Node> leftPtr; 
    std::shared_ptr<Node> rightPtr; 
    Node(int val) : value(val) { 
     std::cout<<"Contructor"<<std::endl; 
    } 
    ~Node() { 
     std::cout<<"Destructor"<<std::endl; 
    } 
}; 

template <class T> 
class BST { 

    private: 
     std::shared_ptr<Node<T>> root; 

    public: 
     void set_value(T val){ 

      root->value = val; 
     } 
     void print_value(){ 
      std::cout << "Value: " << root.value << "\n"; 
     } 
}; 

int main(){ 

    class BST t; 
    t.set_value(10); 
    t.print_value(); 

    return 1; 
} 

エラー:

g++ -o p binary_tree_shared_pointers.cpp --std=c++14 
binary_tree_shared_pointers.cpp:39:8: error: elaborated type refers to a template 
     class BST t; 
      ^
binary_tree_shared_pointers.cpp:21:7: note: declared here 
class BST { 
    ^
+0

'root.value'または' root-> value'? –

+0

'class BST t;'あなたはCから来ていますか? 1)それは正当ではないC++で、関連しないメモでも 'struct'は必要ないが、許されている2)テンプレートのパラメータを指定する必要がある – Rakete1111

+0

あなたが尋ねたエラーについては、テンプレート化されたクラスを使用しますか?あなたは 'Node'テンプレートでそれを行いますか?おそらくあなたはいくつかのステップを取って、[良い初心者の本を見つける](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)読むべきですか? –

答えて

5

をあなたはBSTの種類を指定していません。 テンプレートは、指定しない限り、不完全な型です。もう1つの選択肢は、コンパイラが何らかの形で型を推論できることです。 それ以外の場合は不完全なタイプなのでエラーになります。

あなたが例えばタイプintのツリーを作りたい場合は、次のようになります。あなたがtを宣言するために、クラスのキーワードを必要としない

BST<int> t; 
t.set_value(10); 
t.print_value(); 

注意。

+0

テンプレートは一般的なデータ型に使用されているので、タイプを定義できません。だから、私は整数ツリーのためにBST を使用して終了するつもりなら、テンプレートの使用は何ですか? –

+1

テンプレートは、クラスの青いプリントです。これを使って、同じ振る舞いで多くの異なるクラスを書くことができます。 'BST intTree'は整数のみを含むツリーで、' BST stringTree'は文字列を含みます。しかし、 'intTree'は文字列を保持することができず、どちらも' stringTree'は整数を保持できません。これは単にテンプレートの目的ではありません。 – muXXmit2X

+0

Cool。意味する:)ありがとう.. :) –

関連する問題