错误没有命名类型

时间:2016-06-05 18:04:37

标签: c++ compiler-errors

我收到编译错误:错误" Node"没有命名类型。 这是我的标题:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H



template <class ItemType>
class LinkedList
{
public:
    LinkedList(); // Constructor

    bool isEmpty() const; // Checks if list is empty.
    int getLength() const; // Returns the amount of times in the list.
    bool insert(int index, const ItemType& insertItem); // Inserts an item at index.
    bool remove(int index);  // Removes item at index.
    void clear();  // "clears" the list, but actually sets amount of items to zero.
    ItemType getIndex(int index);  // Returns the item at a given index.
    int find(const ItemType& findItem);  // Finds an item, then returns the index it was found.
    void printList() const;

private:
    struct Node // Struct so I can have my linked list.
    {
        ItemType item; // Data item.
        Node* next; // Pointer to the next node.
    };

    int itemCount; // Current amount of items in list.
    Node* headPtr; // Head/beginning of the list.

    Node* getNodeAt(int position) const; // Private method to get position.
};
#include "LinkedList.cpp"
#endif // LINKEDLIST_H

然后我的cpp:

#include "LinkedList.h"
#include <iostream>
using namespace std;

// All the other methods, and at the very end...

template<class ItemType>
Node* LinkedList<ItemType>::getNodeAt(int position) const //Error is here.
{
    Node* retPtr = headPtr;
    int index = 0;
    while(index != position)
    {
        retPtr = retPtr->next;
        index++;
    }
    return retPtr;
}

错误发生在getNodeAt的cpp文件中的方法签名处。从我所读过的内容来看,似乎错误是在引用了一个尚未定义的对象时出现的,但我并没有真正看到我是如何犯这个错误的。

2 个答案:

答案 0 :(得分:1)

// All the other methods, and at the very end...

template<class ItemType>
Node* LinkedList<ItemType>::getNodeAt(int position) const //Error is here.
{
    Node* retPtr = headPtr;
    int index = 0;
    while(index != position)
    {
        retPtr = retPtr->next;
        index++;
    }
    return retPtr;
}

Node是包含结构的成员结构,因此在返回类型中执行LinkedList<ItemType>::Node*,因为您尚未进入LinkedList<ItemType>范围。

此外,如果任何其他文件直接使用该模板函数(或通过其他模板函数),您可能必须在某一点将其移动到头文件中,否则您将获得另一个编译器错误。

答案 1 :(得分:1)

错误是正确的:程序中的任何位置都没有Node类型。但是有LinkedList<ItemType>::Node类型。改为使用它。

另一个问题:您不应在LinkedList.cpp中加入LinkedList.h。当然,如果您包含LinkedList.h文件,则不应在LinkedList.cpp中加入.cpp。一般方法是在头文件中实现所有模板代码。如果要分离实现并将其包含在头文件中,则不要在实现中包含头文件,并将其扩展名与源代码扩展名不同,以免混淆构建系统。