2016-12-02 160 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

相关问题