2016-06-26 2 views
-4

Я пытаюсь создать два класса: lista и iterator. Итератор будет другом класса lista. Проблема в том, что когда я объявляю итератор класса, я получаю эту ошибку: итератор не является классом шаблона. Таковы два file.hне является классом шаблона

Lista .h:

*#include "nodo.h"* 

template <class T> 

class lista{ 

public : 

    //all the function 

private : 
    nodo<T> *list; 
    nodo<T> *tail; 
    int n; 


    friend class iterator<T>; 


}; 

iterator.h:

*#include "lista.h"* 

template<class Z> 

class iterator { 

public : 

    lista<Z> a; 
    iterator(); 
}; 
+1

'friend class iterator ;' должен, вероятно, быть 'template friend class iterator;'. –

+1

@BoPersson Как так? Параметр 'T' является параметром класса. Проблема в том, что 'iterator' не определен в этот момент (в' friend class iterator '). Используйте форвардную декларацию. – Nelfeal

+0

@Nelxiost Параметры шаблона не _inherited_. –

ответ

-1

iterator Имя уже используется в стандартной библиотеки C++ , поэтому старайтесь избегать наименования ваших переменных и типов с ним как можно больше в вашем коде.

+1

Отлично, но это комментарий; а не ответ на вопрос. – WhozCraig

+0

Спасибо, я думаю, я должен был это сделать. –

0

Вам необходимо направить объявление iterator<T>, так что lista<T> знает, что он существует.

// Forward declaration of iterator<T> 
template <class T> 
class iterator; 

template <class T> 
class lista { 
    ... 
    friend class iterator<T>; 
}; 

Хотя нет необходимости, я рекомендую реализации итератора для lista в качестве внутреннего класса lista. Тогда случайному читателю очевидно, что итератор подразумевается как итератор для содержащего класса.

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