2017-12-02 131 views
0

我正在使用模板類型爲鍵,數據和比較函數製作BST類。我有一個函數創建新的節點並返回一個指向其他函數的指針。問題是,使用模板時返回類型無效。我創建了以前沒有模板的樹,並返回一個類型節點*不是問題。我不確定幕後發生的事情是否使模板版本無效。 我得到的錯誤包括:模板並返回一個節點*

面目全非模板聲明/定義

語法錯誤:缺少「;」之前'*'

缺少類型說明符 - int假定。注意: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; 
} 

這裏,額外typename關鍵字是必要的,因爲Node是什麼叫做依賴型(嵌套內在的東西,取決於模板參數類型)。

您不需要將該長名稱放在類的正文中,因爲在該上下文中編譯器已知道要查看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