我已经声明了一个包含另一个类AVLNode的类AVL。 AVL类包含插入函数。我想插入返回AVLNode指针。我在这段代码中遇到编译错误。什么是错误?
template<class KeyType>
class AVL
{
public:
template<class KeyType>
class AVLNode{};
AVLNode<KeyType>* insert(const KeyType& key);
}
template<class KeyType>
AVLNode<KeyType>* AVL<KeyType>::insert(const KeyType& key)
{
if (m_root == 0)
{
m_root = new AVLNode<KeyType>(key);
return m_root;
}
else
return insert_Helper(key,m_root);
}
答案 0 :(得分:2)
您的AVLNode
类模板是AVL
中的嵌套类模板。要访问它,请使用AVL<KeyType>::AVLNode<KeyType>
。 (我不确定为什么你让AVLNode
成为一个类模板;我怀疑这是必要的。你真的想拥有AVL<int>::AVLNode<float>
吗?)
或者,您可以使用尾随返回类型:
template<typename KeyType>
auto AVL<KeyType>::insert(const KeyType& key) -> AVLNode<KeyType>*
这是允许的,因为您已将此限定为AVL<KeyType>
的成员函数,因此您现在可以自由使用其中的名称。
答案 1 :(得分:0)
@Anton_Golov说你的班级只需要一个模板,因为当你的节点可以浮动时,有一个整数树是没有意义的。您只需要一个模板。为了不与它们混淆,尝试让你的类更紧凑,保持整个函数在你的类中,我认为这是数据结构或某些开源应用程序的某种功课,所以没有必要写类之外的功能,因为你使用模板并且必须在类之外写很多东西。这是您的代码没有错误:
template<class KeyType>
class AVL
{
public:
class AVLNode{};
AVLNode m_root;
AVLNode* insert(const KeyType& key)
{
if (m_root == 0)
{
m_root = new AVLNode(key);
return m_root;
}
else
return insert_Helper(key,m_root);
}
};
AVL<int> myTree;
你有一个带有 int 节点的 AVL 树