为什么我得到没有类型错误的声明 - 链表?

时间:2012-09-06 10:29:13

标签: c++ templates linked-list

您好我正在尝试使用模板和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

以下是节点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

以下是linkedlist基类的定义:

#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的新手,所以试着把我的思绪包围起来。任何帮助都将非常感谢。

2 个答案:

答案 0 :(得分:1)

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

在这种情况下,看起来迭代器类型根本不依赖于列表类型,因此您只需从#include "linkedlistlype.h"中删除"linkedlistiterator.h"

答案 1 :(得分:1)

似乎linkedlisttype.hlinkedlistiterator.h互相包含。

这表明你心中的联系相当紧密。您可能希望拥有LinkedList<T>类和嵌套LinkedList<T>::Iterator类。