Letholdrus
Letholdrus

Reputation: 1281

Why am I getting declaration with no type error - linked list?

Hi I am trying to implement a linked list using templates and ADT. At the moment I have two classes. One is an iterator for linked list and the other is the base class for linked lists that I will use to derive linked list classes from.

When trying to implement two functions that will give me an iterator at the start and end of the list respectivly I get compile error saying "ISO C++ forbids declaration of 'linkedListIterator' with no type"

Here is the code for the definition of the iterator:

#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

Here is the code for the definition of the node Type

#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

Here is the definition of the linkedlist base class:

#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

I am new to templates and ADT so trying to wrap my mind around this. Any help will be most appreciated please.

Upvotes: 0

Views: 978

Answers (2)

&#214;&#246; Tiib
&#214;&#246; Tiib

Reputation: 10979

Seems that both linkedlisttype.h and linkedlistiterator.h include each other.

That indicates rather close coupling in your mind. You probably want to have LinkedList<T> class and nested LinkedList<T>::Iterator class.

Upvotes: 1

Mike Seymour
Mike Seymour

Reputation: 254431

You have two headers which each try to include each other. The result is that, if you #include "linkedlistiterator.h", the definition of linkedListType appears before that of linkedListIterator; hence the error due to linkedListIterator not being declared at that point.

In this case, it looks like the iterator type does not depend on the list type at all, so you can simply remove the #include "linkedlistlype.h" from "linkedlistiterator.h".

Upvotes: 1

Related Questions