我收到编译错误:错误" 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文件中的方法签名处。从我所读过的内容来看,似乎错误是在引用了一个尚未定义的对象时出现的,但我并没有真正看到我是如何犯这个错误的。
答案 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
。一般方法是在头文件中实现所有模板代码。如果要分离实现并将其包含在头文件中,则不要在实现中包含头文件,并将其扩展名与源代码扩展名不同,以免混淆构建系统。