2013-06-13 3 views
0

Я довольно новичок в C++ и в попытке создать связанный список я столкнулся с ошибкой, которую я не понимаю.Доступ к указателю вложенного класса

код:

template <typename T> 
class List{ 
    class Node{ 
      T data; 
     Node<T> *next; 
     Node<T> *previous; 

     Node<T>(T& data,const Node<T> *next,const Node<T> *previous): data(data), 
        next(next),previous(previous){ 
      }; 
      }; 
    Node<T> *head; 
    Node<T> *tail; 
    int size; 
public: 
    class Iterator{ 
      Node<T> *node; 
      List<T> *list; 
      }; 
    void List<T>::remove(List<T>::Iterator& It){ 
     if(It.list!=this){ // FIELD list COULD NOT BE RESOLVED 
      throw NON_MATCHING_LIST(); 
     } 
     if(size==0 || It.node=tail){ //FIELD node COULD NOT BE RESOLVED 
      throw ELEMENT_NOT_FOUND(); 
     } 
     It.node->previous=It.node->next; //FIELD node COULD NOT BE RESOLVED (and naturally the rest). 
     It.node->next->previous=It.node->previous 
    } 

};

в моей функции удалить, я пытаюсь удалить элемент из списка, который пришел прямо перед итератора, увы, я получаю сообщение об ошибке говорящее

узел/список полей не могут быть решены

Я пробовал передавать итератор как тип Iterator & или Iterator, ни сработали.

Пойду за отзыв.

+1

Не уверен, что это единственная проблема, но вам нужны некоторые 'typename's, например:' typename List :: Iterator' –

+0

'Node' не является шаблоном класса. Просто скажите 'Node', а не' Node '. 'List' - это шаблон, поэтому скажите' List :: Node'. –

+0

это действительно решено, спасибо. Энди, если вы ответите, я отвечу. – Thongurf

ответ

1

Помимо вопросов, которые другие упомянутые в комментариях к этому вопросу, кажется, ваш (первая) проблема заключается в том, что вы должны использовать typename disambiguator:

typename List<T>::Iterator 
// ^^^^^^^^ 

Это говорит компилятору, что он должен разобрать Iterator как имя тип, а не имя элемента данных List<T>.