在 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&lt;int&gt;::n_leaf(T) 调用它。

由于您的 util_bin_tree 类没有任何数据成员,您可以使用 namespace util_bin_tree 代替,并将 template&lt;class T&gt; 放在每个函数之前。

【讨论】:

以上是关于在 C++ 中找不到此函数的标识符的主要内容,如果未能解决你的问题,请参考以下文章

错误:在包“android”中找不到属性“textAlignment”的资源标识符

在 C# 中找不到 C++ COM DLL 中的导出函数

在 Xcode 4.6 中找不到 Mac 安装程序证书

在我的 math.h 中找不到 log2?

stat() 在 C++ 中找不到文件

“在包 'android' 中找不到属性 'showAsAction' 的资源标识符”