0

您好我正在尝试使用模板和 ADT 实现链接列表。目前我有两节课。一个是链表的迭代器,另一个是链表的基类,我将使用它派生链表类。

当尝试实现两个函数时,它们将分别在列表的开头和结尾给我一个迭代器,我得到编译错误,说“ISO C++ 禁止声明没有类型的 'linkedListIterator'”

下面是定义迭代器的代码:

#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 的新手,所以我试图围绕这一点思考。任何帮助将不胜感激。

4

2 回答 2

1

您有两个标题,每个标题都尝试相互包含。结果是,如果你#include "linkedlistiterator.h", 的定义linkedListType出现在linkedListIterator;之前。因此由于当时linkedListIterator未声明而导致的错误。

在这种情况下,看起来迭代器类型根本不依赖于列表类型,因此您可以简单地删除#include "linkedlistlype.h"from "linkedlistiterator.h"

于 2012-09-06T10:39:40.967 回答
1

似乎两者linkedlisttype.h兼而有之linkedlistiterator.h

这表明你的想法相当紧密。你可能想要有LinkedList<T>类和嵌套LinkedList<T>::Iterator类。

于 2012-09-06T10:40:39.093 回答