2015-01-23 2 views
0
template <typename T> 
class BST 
{ 
private: 
    class TreeNode 
    { 
    public: 
     T data; 
     TreeNode *left; 
     TreeNode *right; 
     TreeNode(const T & d, TreeNode *lchld = NULL, TreeNode *rchld = NULL): 
      data(d), left(lchld), right(rchld) {} 
    }; 

    TreeNode *root; 
    vector<list<TreeNode *> *> createLevelLinkedList(TreeNode *root); 
public: 
}; 

template <typename T> 
vector< list< typename BST<T>::TreeNode *> *> BST<T>::createLevelLinkedList(TreeNode *root) 
{ 
    vector<list<BST<T>::TreeNode *> *> result; 
    if (root == NULL) return result; 
    list<TreeNode *> *treeNodeList = new list<TreeNode *>(); 
    int level = 0; 

    treeNodeList->push_back(root); 
    result[0] = treeNodeList; 

    while(true) { 
     treeNodeList = new list<TreeNode *>(); 
     list<TreeNode *>::iterator itr; 

     for(itr = (result[level])->begin(); itr != (result[level])->end(); itr++) 
     { 
      TreeNode *temp = *itr; 
      if(temp != NULL) 
      { 
       if(temp->right != NULL) treeNodeList->push_back(temp->right); 
       if(temp->left != NULL) treeNodeList->push_back(temp->left); 
      } 
     } 

     if(treeNodeList->size() > 0) 
     { 
      result[level++] = treeNodeList; 
     } else { 
      break; 
     } 
    } 
    return result; 
} 

내가 코드의 다음 줄에 위의 코드를하지만 점점 컴파일 오류를 컴파일하려고 :오류 동안

여러 마커 :

list<TreeNode *>::iterator itr; 

오류는 다음과 같은 말 이 줄에서 - 'std :: list :: TreeNode *> :: iterator'전에 'typename'이 필요합니다. 'std :: list :: TreeNode *>'가 종속 범위이므로 - 예상 ';' before 'itr'

나는 다양한 옵션을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 템플릿 기반이 아닌 코드를 컴파일하면 작동하지만이 템플릿 기반 코드를 컴파일하려고합니다. 누군가가 나를 찾아 문제를 발견하고 해결 방법을 제안 할 수 있습니까?

답변

2

그냥이 라인에서 오류를

여러 마커를 따라 - 'std::list::<TreeNode*>::iterator'전 필요 '유형 이름' 'std::list::<TreeNode*>가'종속 범위 때문에 - 예상 ';' 'ITR'

전에 쓴 :

list<TreeNode*>::iterator itr; 

당신은 쓸 필요가 :

typename list<TreeNode*>::iterator itr; 

그 이유는 list<TreeNode*>::iterator가 있는지 여부를 컴파일러는이 시점에서 알 수 없습니다입니다 중첩 된 형식 또는 멤버 변수를 반환해야합니다. 누가 알고 있을까요? list<TreeNode*>의 전문화가있을 수도 있습니다. 그 외 다른 곳에서는 iterator을 회원으로 규정합니다! 이는 종속 범위으로 알려져 있습니다. 왜냐하면 iterator을 의미하기 때문에 list<TreeNode*>의 인스턴스로에 의존합니다.

+0

감사합니다. 나는 아직도 설명이 명확하지는 않지만 일을한다. 이 링크를 더 자세히 읽을 수있는 링크가 있습니까? – user489703

+0

@ user489703 [이 참조] (http://en.cppreference.com/w/cpp/language/dependent_name)를 사용해보십시오. – Barry