c++ - 作为函数参数的模板结构

标签 c++ templates dictionary struct tree

我有我的结构字典

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

我需要给这个函数一个节点,因为那样我将使用递归算法,我不能给函数一个字典类型,因为树和字典是不同的。

最佳答案

错误消息会告诉您哪里出了问题。在你使用它的地方,Diccionary<T,U>::Nodo尚未定义。

方案一:先定义。

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;    
}; 

方案二:既然你把它当作指针使用,那么之前声明一下就可以了。

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尽可能少。我还没有写过一个需要 friend 的 C++ 程序在我的代码中的任何地方,我已经写了很多。我认为这是一种代码味道。

此外,这看起来像是您正在尝试实现您自己的树结构。请考虑使用标准库容器。您可能不会做得更好,如果您做得更好,您会提出不同的问题。

关于c++ - 作为函数参数的模板结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40940966/

相关文章:

c++ - 如何删除在函数中创建的动态数组

c++ - 空参数包的模板特化

c++ - 模板类编译错误

ios - 如何将文本转换为表情符号?

javascript - 我的表单具有Mapbox路线API?

c++ - gcc 返回 "No such file or directory"

c++ - 在 C++ 中连接字符串和 boolean 值?

c++ - 声明可变长度数组

go - 使用 Go 模板中的变量键访问映射值

python - 基于重复值合并字典