2014-03-13 3 views
0

다른 클래스 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

컴파일 오류가 무엇과 AVL 트리를 가지고 : 다음은 오류없이 코드는? – hrkz

답변

2

귀하의 AVLNode 클래스 템플릿은 AVL 내에서 중첩 된 클래스 템플릿입니다. 액세스하려면 AVL<KeyType>::AVLNode<KeyType>을 사용하십시오.

template<typename KeyType> 
auto AVL<KeyType>::insert(const KeyType& key) -> AVLNode<KeyType>* 

이 : (.? 당신이 AVLNode 클래스 템플릿을 만든 이유를 잘 모르겠어요 내가 그 필요한 의심 당신이 정말로 AVL<int>::AVLNode<float>을 하시겠습니까)

양자 택일로, 당신은 뒤에 반환 형식을 사용할 수 있습니다 당신이 이미 AVL<KeyType>의 멤버 함수로 자격을 부여했기 때문에 허용되었으므로 이제 자유롭게 이름을 사용할 수 있습니다.

+2

'AVLNode'가 템플릿 일 필요는 없을뿐만 아니라 템플릿 클래스에'KeyType'이라는 이름을 사용하는 것 외에도 둘러싸는 클래스'AVL'의 인수는 'KeyType'그림자의 선언입니다. 템플릿 매개 변수 '. – iavr

0

@Anton_Golov는 노드가 수레 일 수있는 동안 정수 트리를 갖는 것이 이해가되지 않기 때문에 클래스에 단 하나의 템플릿 만 필요하다고 말했다. 템플릿은 하나만 있으면됩니다. 그들과 혼동하지 않기 위해서, 클래스 내에서 모든 함수를 유지하면서 클래스를보다 작게 만들려고 노력합니다. 이것은 데이터 구조 나 일부 오픈 소스 응용 프로그램을위한 숙제라고 가정합니다. 템플릿을 사용하고 클래스 외부에 많은 내용을 써야하기 때문에 클래스 외부의 기능을 사용할 수 없습니다. AVL<int> myTree;

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); 
    } 
}; 

당신이 INT 노드

관련 문제