2017-12-02 10 views
0

私は、キー、データ、および比較関数のテンプレートタイプを使用してBSTクラスを作成しています。私は新しいノードを作成し、他の関数へのポインタを返す関数を持っています。問題は、テンプレートの使用中に戻り値の型が無効であることです。以前はテンプレートを使わずにツリーを作成し、型ノードを返すことは問題ではありませんでした。私はテンプレートのバージョンを動作させないために何が起こっているのか分かりません。 私は取得していますエラーが含まれます:テンプレートを返してノードを返す*

認識できないテンプレート宣言/定義

構文エラー:見つかりません「;」 before '*'

タイプ指定子がないとみなします。注:C++は、デフォルト-INT

私のクラステンプレート、ノード構造体およびノー​​ドの作成機能をサポートしていない以下の通りです:

template <typename KEY, typename VALUE, bool (*COMPARE)(KEY, KEY)> 
class BSTROOT { 

private: 
    struct Node { 
     KEY key; 
     VALUE value; 
     Node *left = nullptr; 
     Node *right = nullptr; 
    }; 
    Node* createNode(const KEY& key, const VALUE& value); 



template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)> Node* BSTROOT<KEY, VALUE, COMPARE>::createNode(const KEY& key, const VALUE& value) { 
    Node *temp = new Node; 
    temp->key = key; 
    temp->value = value; 
    return temp; 
} 

任意のヒントや情報をいただければ幸いです。

+0

あなたは'}とクラス定義を閉じたのに役立つと思いますか? – Cornstalks

+0

[最小、完全、および検証可能な例]を提供してください(https://stackoverflow.com/help/mcve) – klutt

+0

私のすべて{}は良いです、私はすべてのコードのまっすぐなコピー貼り付けをしませんでした私は考えていたビットは関連していた。私はページに膨大な量のコードを捨てるべきではないと思った。私が最初に質問したことは、私がいつも期待していることをしないと私を許します。 – odoylerules

答えて

1

Node*タイプはBSTROOTタイプの内部にネストされているため、実装の関数からの戻り値の型を明示的に指定する必要があります。すなわち、このようなものになります。ここでは

template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)> 
typename BSTROOT<KEY, VALUE, COMPARE>::Node* 
BSTROOT<KEY, VALUE, COMPARE>::createNode(const KEY& key, const VALUE& value) { 
    Node *temp = new Node; 
    temp->key = key; 
    temp->value = value; 
    return temp; 
} 

Node依存タイプ(テンプレートパラメータに依存して何かの中にネストされたタイプ)と呼ばれるものであるため、余分なtypenameキーワードが必要です。

コンパイラが既にBSTROOTの内部を知っているので、その長い名前をクラス本体に入れる必要はありません。しかし、クラスの外側では、コンパイラはNodeという名前の他のグローバルタイプではなく、ネストされたNodeタイプを見たいと言うことはできません。 `;

+0

これで問題が解決しました。助けてくれてありがとう。 – odoylerules

0

私は、これは

template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)> 
struct Node { 
    KEY key; 
    VALUE value; 
    Node *left = nullptr; 
    Node *right = nullptr; 
}; 

template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)> 
class BSTROOT { 

private: 

    Node* createNode(const KEY& key, const VALUE& value); 


}; 

template<typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)> 
Node * BSTROOT<KEY, VALUE, COMPARE>::createNode(const KEY & key, const VALUE & value) 
{ 
    Node *temp = new Node; 
    temp->key = key; 
    temp->value = value; 
    return temp; 
} 
+0

このコードはコンパイルされません。テンプレート引数を 'Node'型に指定する必要があります。また、これは 'Node'型の内部実装を外部に公開し、現在のシステムのカプセル化を解除します。おそらく私には欠けているという利点がありますか? – templatetypedef

関連する問題