Почему я получаю объявление без списка ошибок, связанных с типом?

Привет я пытаюсь реализовать связанный список, используя шаблоны и ADT. На данный момент у меня есть два класса. Один является итератором для связанного списка, а другой — базовым классом для связанных списков, который я буду использовать для получения классов связанных списков.

При попытке реализовать две функции, которые будут давать мне итератор в начале и конце списка соответственно, я получаю сообщение об ошибке компиляции, говорящее «ISO C ++ запрещает объявление объекта« relatedListIterator »без типа»

Вот код для определения итератора:

#ifndef LINKEDLISTITERATOR_H
#define LINKEDLISTITERATOR_H

#include <stddef.h> //for NULL
#include "nodetype.h"#include "linkedlisttype.h"

template <class Type>
class linkedListIterator
{
public:
linkedListIterator();

linkedListIterator(nodeType<Type> *ptr);

Type operator*();

linkedListIterator<Type> operator++();

bool operator==(const linkedListIterator<Type>& right) const;

bool operator!=(const linkedListIterator<Type>& right) const;

private:
nodeType<Type> *current;
};

#endif // LINKEDLISTITERATOR_H

Вот код для определения типа узла

#ifndef NODETYPE_H_INCLUDED
#define NODETYPE_H_INCLUDED

//Definition of the node
template <class Type>
struct nodeType
{
Type info;
nodeType<Type> *link;
};

#endif // NODETYPE_H_INCLUDED

Вот определение базового класса связного списка:

#ifndef LINKEDLISTTYPE_H
#define LINKEDLISTTYPE_H

#include "nodetype.h"#include "linkedlistiterator.h"
//Definition of linked list
template <class Type>
class linkedListType
{
public:
const linkedListType<Type>& operator=
(const linkedListType<Type>&);

void initializeList();

bool isEmptyList() const;

void print() const;

int length() const;

void destroyList();

Type front() const;

Type back() const;

virtual bool search(const Type& searchItem) const = 0;

virtual void insertFirst(const Type& newItem) = 0;

virtual void insertLast(const Type& newItem) = 0;

virtual void deleteNode(const Type& deleteItem) = 0;

// this is where the error comes
linkedListIterator<Type> begin();

// and here as well
linkedListIterator<Type> end();

linkedListType();

linkedListType(const linkedListType<Type>& otherList);

~linkedListType();

protected:
int count;
nodeType<Type> *first;
nodeType<Type> *last;

private:
void copyList(const linkedListType<Type>& otherList);
};

#endif // LINKEDLISTTYPE_H

Я новичок в шаблонах и ADT, поэтому пытаюсь обдумать это. Любая помощь будет оценена, пожалуйста.

0

Решение

У вас есть два заголовка, каждый из которых пытается включить друг друга. В результате, если вы #include "linkedlistiterator.h"определение linkedListType появляется до того из linkedListIterator; следовательно ошибка из-за linkedListIterator не быть объявленным в тот момент.

В этом случае, похоже, что тип итератора вообще не зависит от типа списка, поэтому вы можете просто удалить #include "linkedlistlype.h" от "linkedlistiterator.h",

1

Другие решения

Кажется что оба linkedlisttype.h а также linkedlistiterator.h включать друг друга.

Это указывает на довольно тесную связь в вашем уме. Вы, вероятно, хотите иметь LinkedList<T> класс и вложенный LinkedList<T>::Iterator учебный класс.

1

По вопросам рекламы [email protected]