【问题标题】:A template struct as a function argument作为函数参数的模板结构
【发布时间】:2016-12-02 21:17:25
【问题描述】:

我有我的结构字典

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 的参数有一个错误,我不知道如何给这个函数一个指向节点的指针。问题是节点在结构中,所以编译器告诉我:

错误:‘struct Diccionario’中没有名为‘Nodo’的类型

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

【问题讨论】:

  • 将类型定义放在好友声明之前。
  • Diccionario的定义是什么?
  • 但问题是 te 类型必须是私有的,de insertAux 函数也是私有的,但我已经把它放在那里了。所以如果类型仍然是私有的,我能做什么?类型是私有的,但函数(是私有的)必须是朋友
  • 你的类定义中可以有多个 private 部分。

标签: c++ templates dictionary struct tree


【解决方案1】:

错误信息告诉你,出了什么问题。在您使用它的地方,Diccionary&lt;T,U&gt;::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;    
}; 

方案二:既然你把它当做指针来用,那么在前面声明一下就够了。

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++程序,而且我已经写了很多。我认为这是一种代码味道。

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

【讨论】:

  • 谢谢,它有效。我认为它解决了我的问题。我不是想改进标准库容器,但这是课堂作业,所以我需要按照老师的要求去做。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多