recherche

Maison  >  Questions et réponses  >  le corps du texte

visual-studio - Lors de l'écriture d'un arbre binaire en C++, l'utilisation de modèles et la définition de classes amies génèrent une erreur.

Description du problème

Comme le titre l'indique, j'ai récemment appris les structures de données et les implémenté en C++. J'ai rencontré les problèmes suivants lors de l'implémentation d'un arbre binaire.

Dans le code du livre, l'arbre binaire se compose de deux structures de donnéesBinaryTreeBinartTreeNode, et toutes deux utilisent des modèles, comme suit :

template <class T>
class BinaryTreeNode{
friend class BinaryTree<T>;
private: 
    T data;
    BinaryTreeNode<T> *left;
    BinaryTreeNode<T> *right;
    /*...其他...其他...其他...*/
}

template <class T>
class BinaryTree{
private: 
    BinaryTreeNode<T> root;
    /*...其他...其他...其他...*/
}

Mais j'ai rencontré l'erreur suivante lors de sa mise en œuvre :

Exemple de code :

template <class T>
class BinaryTreeNode {
friend class BinaryTree<T>; /* 消除该句后可通过编译 */
private:
    T info;
    BinaryTreeNode<T> left;
    BinaryTreeNode<T> right;
};
template <class T>
class BinaryTree {
private:
    BinaryTreeNode<T> *root;
};

Erreur :

1>e:itc++binarytreebinarytreemybianrytree.h(20): error C2989: “BinaryTree”: 类 模板 已经声明为非类 模板

erreur c2989

Capture d'écran :

Environnement :

visual studio 2017 + win10 (mac double système)

Désolé tout le monde ! !

迷茫迷茫2834 Il y a quelques jours720

répondre à tous(1)je répondrai

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 13:31:03

    template <class T> class BinaryTree; // 加一个前置声明
    
    template <class T>
    class BinaryTreeNode {
    friend class BinaryTree<T>; /* 消除该句后可通过编译 */
    private:
        T info;
        BinaryTreeNode<T> left;
        BinaryTreeNode<T> right;
    };
    template <class T>
    class BinaryTree {
    private:
        BinaryTreeNode<T> *root;
    };
    

    ps : La version mobile de segmentfault est vraiment une merde. Après m'être tenu le nez et l'avoir utilisée pendant si longtemps, j'ai réalisé que je ne pouvais pas saisir le signe supérieur ou inférieur à 

    répondre
    0
  • Annulerrépondre