2016-12-02 196 views
0

我有我的結構詞典模板結構作爲函數參數

template<typename T, typename U> 
struct Diccionary { 
    friend void insert<T, U>(Diccionario<T,U>& d, const T& c, const U& v); 
    friend void insertAux<T, U>(typename Diccionary<T,U>::Nodo* a, const T& c, const U& v);  

private: 
    struct Nodo{ 
     T t; 
     U u; 
     Nodo* left; 
     Nodo* right; 
    }; 

    Nodo* root; 
    Nodo* iterator; 
    int size;  
}; 

我有insertAux的參數錯誤,我不知道如何給這個函數指針的節點。問題是,該節點是一個結構,所以編譯器告訴我:

error: no type named ‘Nodo’ in ‘struct Diccionario

我需要給這個功能的節點,因爲那時我將使用遞歸算法,我不能給功能的字典類型,因爲樹和字典是不同的。

+3

將類型定義放在朋友聲明之前。 – SergeyA

+0

'Diccionario'的解釋是什麼? –

+0

但問題是,te類型必須是私人的,也de insertAux功能是私人的,但我已經把它放在那裏。所以如果類型仍然是私人的,我可以做什麼?該類型是私有的,但函數(私有)必須是朋友 – Serizba

回答

1

錯誤消息告訴你,什麼是錯的。在您使用它的地方,Diccionary<T,U>::Nodo尚未定義。

解決方案1:前定義它。

template<typename T, typename U> 
struct Diccionary { 
private: 
    struct Nodo{ 
     T t; 
     U u; 
     Nodo* left; 
     Nodo* right; 
    }; 

public: 
    friend void insert<T, U>(Diccionario<T,U>& d, const T& c, const U& v); 
    friend void insertAux<T, U>(typename Diccionary<T,U>::Nodo* a, const T& c, const U& v);  

private: 
    Nodo* root; 
    Nodo* iterator; 
    int size;  
}; 

解決方案2:因爲您將它用作指針,所以先聲明它就足夠了。

template<typename T, typename U> 
struct Diccionary { 
private: 
    struct Nodo; 
public: 
    friend void insert<T, U>(Diccionario<T,U>& d, const T& c, const U& v); 
    friend void insertAux<T, U>(typename Diccionary<T,U>::Nodo* a, const T& c, const U& v);  

private: 
    struct Nodo{ 
     T t; 
     U u; 
     Nodo* left; 
     Nodo* right; 
    }; 

    Nodo* root; 
    Nodo* iterator; 
    int size;  
}; 

作爲一般說明:儘量少用friend。我還沒有編寫一個單獨的C++程序,需要在我的代碼中的任何地方使用friend,而且我寫了很多。我認爲它是一種代碼味道。

而且這看起來像你想實現自己的一種樹狀結構。請考慮使用標準庫容器。你可能不會更好,如果你這樣做,你會問不同的問題。

+0

謝謝,它的工作原理。我認爲它解決了我的問題。我不是想改進標準庫容器,但是這是班級工作,所以我需要按照我的老師的要求去做。非常感謝你! – Serizba

相關問題