在 C++ 中找不到此函数的标识符
Posted
技术标签:
【中文标题】在 C++ 中找不到此函数的标识符【英文标题】:Identifier not found for this function in c++ 【发布时间】:2020-02-01 20:15:01 【问题描述】:好吧,我写了一个计算二叉树中有多少叶子的类:
#ifndef _UTIL_BIN_TREE_H_
#define _UTIL_BIN_TREE_H_
#include"bin_treec.h"
template <class T>
class util_bin_tree
public:
static int n_leaf(const Bin_treec<T>& T)
int i;
if (!T.empty())
if (T->spazio[i].sinistro == NULL && T->spazio[i].destro == NULL)
return 1;
else
return n_leaf(T->T->spazio[i + i].sinistro) + n_leaf(T->T->spazio[i + i].destro);
;
static int n_level(const Bin_treec<T>& T, int i)
//
;
;
#endif
这是创建二叉树的类:
#ifndef _Bin_treecC_H_
#define _Bin_treecC_H_
#include "Bin_tree.h"
#include "exceptions.h"
template <class T>
class Bin_treec : public Bin_tree<T, int>
static const int NIL = -1;
public:
typedef typename Bin_tree<T, int>::value_type value_type;
typedef typename Bin_tree<T, int>::Nodo Nodo;
struct _cella
Nodo genitore;
Nodo sinistro;
Nodo destro;
value_type valore;
;
typedef struct _cella Cella;
// costruttori e distruttori
Bin_treec();
Bin_treec(int);
~Bin_treec();
// operatori
void create();
bool empty() const;
Nodo root() const;
Nodo parent(Nodo) const;
Nodo sx(Nodo) const;
Nodo dx(Nodo) const;
bool sx_empty(Nodo) const;
bool dx_empty(Nodo) const;
//void costr(Bin_treec<T>);
void erase(Nodo);
T read(Nodo) const;
void write(Nodo, value_type);
void ins_root();
void ins_sx(Nodo);
void ins_dx(Nodo);
private:
int MAXLUNG;
Cella* spazio;
int nNodi;
Nodo inizio;
Nodo libera;
;
template <class T>
Bin_treec<T>::Bin_treec()
MAXLUNG = 100;
spazio = new Cella[MAXLUNG];
create();
template <class T>
Bin_treec<T>::Bin_treec(int nNodi) : MAXLUNG(nNodi)
spazio = new Cella[nNodi];
create();
template <class T>
Bin_treec<T>::~Bin_treec()
erase(inizio);
delete[] spazio;
template <class T>
void Bin_treec<T>::create()
inizio = NIL;
for (int i = 0; i < MAXLUNG; i++)
spazio[i].sinistro = (i + 1) % MAXLUNG;
libera = 0;
nNodi = 0;
template <class T>
bool Bin_treec<T>::empty() const
return(nNodi == 0);
template <class T>
typename Bin_treec<T>::Nodo Bin_treec<T>::root() const
return(inizio);
template <class T>
typename Bin_treec<T>::Nodo Bin_treec<T>::parent(Nodo n) const
if (n != inizio)
return (spazio[n].genitore);
else
return(n);
template <class T>
typename Bin_treec<T>::Nodo Bin_treec<T>::sx(Nodo n) const
if (!sx_empty(n))
return (spazio[n].sinistro);
else
return(n);
;
template <class T>
typename Bin_treec<T>::Nodo Bin_treec<T>::dx(Nodo n) const
if (!dx_empty(n))
return (spazio[n].destro);
else
return(n);
template <class T>
bool Bin_treec<T>::sx_empty(Bin_treec<T>::Nodo n) const
return (spazio[n].sinistro == NIL);
template <class T>
bool Bin_treec<T>::dx_empty(Bin_treec<T>::Nodo n) const
return (spazio[n].destro == NIL);
template <class T>
void Bin_treec<T>::ins_root()
if (inizio == NIL)
inizio = libera;
libera = spazio[libera].sinistro;
spazio[inizio].sinistro = NIL;
spazio[inizio].destro = NIL;
nNodi++;
else
throw RootExists();
template <class T>
void Bin_treec<T>::ins_sx(Nodo n)
if (inizio == NIL)
throw EmptyTree();
if (n == NIL)
throw NullNode();
if (spazio[n].sinistro != NIL)
throw NodeExists();
if (nNodi >= MAXLUNG)
throw FullSize();
else
Nodo q = libera;
libera = spazio[libera].sinistro;
spazio[n].sinistro = q;
spazio[q].sinistro = NIL;
spazio[q].genitore = n;
spazio[q].destro = NIL;
nNodi++;
template <class T>
void Bin_treec<T>::ins_dx(Nodo n)
if (inizio == NIL)
throw EmptyTree();
if (n == NIL)
throw NullNode();
if (spazio[n].destro != NIL)
throw NodeExists();
if (nNodi >= MAXLUNG)
throw FullSize();
else
Nodo q = libera;
libera = spazio[libera].sinistro;
spazio[n].destro = q;
spazio[q].genitore = n;
spazio[q].sinistro = NIL;
spazio[q].destro = NIL;
nNodi++;
template <class T>
void Bin_treec<T>::erase(Nodo n)
if (n != NIL)
if (!sx_empty(n))
erase(spazio[n].sinistro);
if (!dx_empty(n))
erase(spazio[n].destro);
if (n != inizio)
Nodo p = parent(n);
if (spazio[p].sinistro == n)
spazio[p].sinistro = NIL;
else
spazio[p].destro = NIL;
else
inizio = NIL;
nNodi--;
spazio[n].sinistro = libera;
libera = n;
else
throw NullNode();
template <class T>
T Bin_treec<T>::read(Nodo n) const
if (n != NIL)
return (spazio[n].valore);
else
throw NullNode();
template <class T>
void Bin_treec<T>::write(Nodo n, value_type a)
if (n != NIL)
spazio[n].valore = a;
else
throw NullNode();
#endif /* _Bin_treecC_H_ */
这是主要的
#include "util_bin_tree.h"
#include <iostream>
using namespace std;
int main()
Bin_treec<int> T;
typename Bin_treec<int>::Nodo n1 = 0, n2 = 0;
T.ins_root();
T.write(T.root(), 1);
n1 = T.root();
T.ins_sx(n1);
T.ins_dx(n1);
T.write(T.sx(n1), 2);
n1 = T.dx(n1);
T.write(n1, 3);
T.ins_dx(n1);
T.write(T.dx(n1), 4);
T.print();
cout << T;
n_leaf(T); // here i have error C3681
它说我的函数未声明,但我不知道为什么。 完整的错误是:
Severity Code Description Project File Line Suppression State
Error C3861 'n_leaf': identifier not found esercizio C:\Users\mypc\source\repos\esercizio\test.cpp 26
我还有一个虚拟 bin_tree 标头,其中未指定 util_bin_tree,但我认为这并不重要,因为我不使用与树相关的任何函数。 另外,这是我从 T 正确传递数组的方式吗?我只是想将整个对象传递给另一个类函数,编译器暂时没有发现任何错误。但我不能仅仅因为这个问题而测试这个功能。有什么帮助吗?
【问题讨论】:
你想要util_bin_tree::n_leaf
旁注:typedef struct _cella Cella;
在 C++ 中不是必需的(与 C 不同)。结构不再位于唯一的结构命名空间中,它们是当前命名空间的一部分。
问题:如果if (!T.empty())
为假(即您没有输入上面的代码)会怎样?
【参考方案1】:
您的n_leaf
函数不是命名空间范围的函数,它是util_bin_tree
类中的静态函数。您可以使用util_bin_tree<int>::n_leaf(T)
调用它。
由于您的 util_bin_tree
类没有任何数据成员,您可以使用 namespace util_bin_tree
代替,并将 template<class T>
放在每个函数之前。
【讨论】:
以上是关于在 C++ 中找不到此函数的标识符的主要内容,如果未能解决你的问题,请参考以下文章