2015-05-24 2 views
1

У меня есть класс под названием OrderedList в пространстве имен MYLIB. В нем у меня есть вложенный класс, называемый итератором, который будет использоваться как итератор для класса OrderedList.C++: создание экземпляра итератора вложенного класса

Ниже приводится фрагмент моего кода, где я создаю OrderedList и итераторы классов:

template<class T> 
    class OrderedList 
    { 
     private: 
      ListNode<T>* head; 
      ListNode<T>* tail; 
      int total; 
     public: 
      OrderedList(T[],int); 
      ~OrderedList(); 
      void insert(const T&); 
      void sort(int); 
      void output(); 
      class iterator 
      { 
       private: 
        ListNode<T>* curr; 
        int current; 
        OrderedList& order; 
       public: 
        iterator(OrderedList& ord, bool is_end) 
        { 
         this->order = ord; //problem is here 
         if(is_end == false) 
         {... 

Отрывок из моей главной функции:

int main() 
{ 
    int one[5] = {9,7,5,4,1}; 
    MYLIB::OrderedList<int> odd(one,5); 
    odd.output(); 

    MYLIB::OrderedList<int>::iterator starter(odd,false); 

Когда я компилирую это дает мне следующую ошибку:

OrderedList.cpp: In instantiation of ‘MYLIB::OrderedList<T>::iterator::iterator(MYLIB::OrderedList<T>&, bool) [with T = int]’: 
OrderedList.cpp:215:53: required from here 
OrderedList.cpp:47:6: error: uninitialized reference member ‘MYLIB::OrderedList<int>::iterator::order’ [-fpermissive] 
     iterator(OrderedList& ord, bool is_end) 
    ^
+0

Вставьте код (текст), а не изображения. –

+2

Каждый раз, когда выкладывается изображение кода, где-то умирает котенок. Пожалуйста, * Пожалуйста, не делайте этого. – WhozCraig

+0

Lol @WhozCraig. Я считаю, что публикация изображения намного понятнее, чем текст, так как вы также можете ссылаться на номера строк :) –

ответ

1

В C++ ссылка должна быть инициализирована в инициализации члена l ist, он не может быть инициализирован в кустарном теле.

Вы должны изменить свой код

iterator(OrderList& ord, bool is_end) : order(ord) { 
    if (is_end == false) { 
     ... 
    } 
} 

вместо того, чтобы использовать задание.

Назначение ссылки ссылается на другую вещь (она присваивает исходный объект, на который ссылается ссылка). Вы не можете изменить то, к чему привязана ссылка.

PS: Зачем останавливаться там, а не для if ((is_end == false) == true)? ;-)

+0

Спасибо, что он работает :) Ну, да, я могу это сделать, но мне нравится, чтобы мой код был распространен, так что это понятно для будущей справки. Эта нотация может быть неясной время от времени, особенно если вы еще не сделали C++, а затем вернемся к этому коду через некоторое время. –

 Смежные вопросы

  • Нет связанных вопросов^_^