在C+中使用模板时出错+; 我想用C++中的模板实现一个AVL树。头文件、C++文件和主文件如下:

在C+中使用模板时出错+; 我想用C++中的模板实现一个AVL树。头文件、C++文件和主文件如下:,c++,class,templates,header-files,avl-tree,C++,Class,Templates,Header Files,Avl Tree,AVLTree.h #include <iostream> using namespace std; namespace MYTree { template <class T> class AVLTree { public: struct AVLNode { struct AVLNode *left; struct A

AVLTree.h

#include <iostream>

using namespace std;

namespace MYTree
{
    template <class T>
    class AVLTree
    {
        public:
            struct AVLNode
            {
                struct AVLNode *left;
                struct AVLNode *right;
                struct AVLNode *parent;
                int balanceFactor;
            };

            //Constructor
            AVLTree();
            //Variables
            AVLNode *root;
            //Methods
            AVLNode<T> *lookup(const T &key);
            AVLNode<T> *insert(const T &key);
            void remove(const T &key);
    };
}
编辑:

main.cpp:9: error: `AVLTree' undeclared (first use this function)
main.cpp:9: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:9: error: expected primary-expression before "int"
main.cpp:9: error: expected `;' before "int"

我第一次使用模板。有人能帮我吗?

你用的是
AVLNode
,但是
AVLNode
不是一个模板,正如消息所说。

你用的是
AVLNode
但是
AVLNode
不是一个模板,正如消息所说。

您使用的是
AVLNode
,但是
AVLNode
不是一个模板,正如消息所说。

AVLNode
不是一个模板;它是嵌套在模板中的常规类。因此,在模板中,只需使用类名:

AVLNode *lookup(const T &key);
在模板之外,使用模板的范围对其进行限定:

template <class T>
AVLTree<T>::AVLNode* AVLTree<T>::lookup(const T &key)
{
}
如注释中所述,模板(包括类模板的成员函数)通常需要在标题中定义,因为该定义必须在使用它的任何地方都可用

您还需要确保定义位于正确的命名空间中,并在不在该命名空间中时适当地限定模板名称(
MYTree::AVLNode

AVLTree树()声明一个函数;删除
()
以创建默认的初始化对象


最后,不要使用命名空间std执行
,因为它可能会导致混淆的名称冲突。

AVLNode
不是模板;它是嵌套在模板中的常规类。因此,在模板中,只需使用类名:

AVLNode *lookup(const T &key);
在模板之外,使用模板的范围对其进行限定:

template <class T>
AVLTree<T>::AVLNode* AVLTree<T>::lookup(const T &key)
{
}
如注释中所述,模板(包括类模板的成员函数)通常需要在标题中定义,因为该定义必须在使用它的任何地方都可用

您还需要确保定义位于正确的命名空间中,并在不在该命名空间中时适当地限定模板名称(
MYTree::AVLNode

AVLTree树()声明一个函数;删除
()
以创建默认的初始化对象


最后,不要使用命名空间std执行
,因为它可能会导致混淆的名称冲突。

AVLNode
不是模板;它是嵌套在模板中的常规类。因此,在模板中,只需使用类名:

AVLNode *lookup(const T &key);
在模板之外,使用模板的范围对其进行限定:

template <class T>
AVLTree<T>::AVLNode* AVLTree<T>::lookup(const T &key)
{
}
如注释中所述,模板(包括类模板的成员函数)通常需要在标题中定义,因为该定义必须在使用它的任何地方都可用

您还需要确保定义位于正确的命名空间中,并在不在该命名空间中时适当地限定模板名称(
MYTree::AVLNode

AVLTree树()声明一个函数;删除
()
以创建默认的初始化对象


最后,不要使用命名空间std执行
,因为它可能会导致混淆的名称冲突。

AVLNode
不是模板;它是嵌套在模板中的常规类。因此,在模板中,只需使用类名:

AVLNode *lookup(const T &key);
在模板之外,使用模板的范围对其进行限定:

template <class T>
AVLTree<T>::AVLNode* AVLTree<T>::lookup(const T &key)
{
}
如注释中所述,模板(包括类模板的成员函数)通常需要在标题中定义,因为该定义必须在使用它的任何地方都可用

您还需要确保定义位于正确的命名空间中,并在不在该命名空间中时适当地限定模板名称(
MYTree::AVLNode

AVLTree树()声明一个函数;删除
()
以创建默认的初始化对象

最后,不要使用命名空间std执行
,因为它可能会导致混淆的名称冲突。

struct AVLnode
{
    ...
}Node;
您可以声明一个名为
Node
的成员变量

你以后什么时候做

typedef struct Node AVLNode;
尝试将成员变量用作结构

记住,您在编程C++,其中结构名称可以用作与类名相同的类型。

您还可以尝试使用
AVLNode
作为模板,例如

AVLNode<T> *lookup(const T &key);
AVLNode*查找(const T&key);
但是正如错误消息所说,
AVLNode
结构不是模板结构。

如下:

struct AVLnode
{
    ...
}Node;
您可以声明一个名为
Node
的成员变量

你以后什么时候做

typedef struct Node AVLNode;
尝试将成员变量用作结构

记住,您在编程C++,其中结构名称可以用作与类名相同的类型。

您还可以尝试使用
AVLNode
作为模板,例如

AVLNode<T> *lookup(const T &key);
AVLNode*查找(const T&key);
但是正如错误消息所说,
AVLNode
结构不是模板结构。

如下:

struct AVLnode
{
    ...
}Node;
您可以声明一个名为
Node
的成员变量

你以后什么时候做

typedef struct Node AVLNode;
尝试将成员变量用作结构

记住,您在编程C++,其中结构名称可以用作与类名相同的类型。

您还可以尝试使用
AVLNode
作为模板,例如

AVLNode<T> *lookup(const T &key);
AVLNode*查找(const T&key);
但是正如错误消息所说,
AVLNode
结构不是模板结构。

如下:

struct AVLnode
{
    ...
}Node;
您可以声明一个名为
Node
的成员变量

你以后什么时候做

typedef struct Node AVLNode;
尝试将成员变量用作结构

记住,您在编程C++,其中结构名称可以用作与类名相同的类型。

您还可以尝试使用
AVLNode
作为模板,例如

AVLNode<T> *lookup(const T &key);
AVLNode*查找(const T&key);
但正如错误消息