gpt4 book ai didi

C++ 不命名类型

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:43 25 4
gpt4 key购买 nike

在 C++ 中创建一些旧的数据结构。目前我在使用双向链表类时遇到问题:

列表.h:

template <class T>
class List{

private:

int size;

struct listNode{
T data;
listNode* next;
listNode* prev;
listNode(T newData);
};

listNode * head;
listNode * tail;
listNode * curr;
listNode * find(listNode * place, int k);
void removeCurrent(listNode * temp);
public:

List();
int getSize() const;
void insert(int loc, T data);
void remove(int loc);
T const & getItem(int loc) const;
void print();

};

列表.cpp:

#include "List.h"
#include <iostream>

using namespace std;

template<class T>
List<T>::List(){
size = 0;
head->next = tail;
head->prev = NULL;
tail->prev = head;
tail->next = NULL;


}

// getSize: public method that returns the size of the list
template<class T>
int List<T>::getSize() const {
return size;
}

// insert: public method that inserts data into the list
template<class T>
void List<T>::insert(int loc, T data){
if(loc <1){
cout<<"Invalid Location"<<endl;
return;
}
curr = find(head,loc-1);
listNode * newNode = new listNode(data);
newNode->next = curr->next;
newNode->prev = curr;
newNode->next->prev = newNode;
curr->next = newNode;
size++;
}

// remove: public method that inserts data into the list
template<class T>
void List<T>::remove(int loc){
if(loc <1){
cout<<"Invalid Location"<<endl;
return;
}
curr = find(head,loc); // Find the node infront of the target
removeCurrent(curr); // Remove that node
}

// removeCurrent: helper function that removes the current node
template<class T>
void List<T>::removeCurrent(listNode* temp){
listNode* t = temp->next;
temp->data = t->data; // HACK: take data from next node
temp->next = t->next;
t->next->prev = temp;
delete t;
t=NULL;
size--;
}

// find: private helper function that returns a pointer to the k-1 node
template<class T>
listNode * List<T>::find(listNode * place, int k){
if((k==0) || (place==NULL))
return place;
else return find(place->next,k-1);
}

// getItem: returns data at location loc
template<class T>
T const& List<T>::getItem(int loc) const{
curr = find(head,loc);
return curr->data;
}

// print: prints the sequence of variables in the list
template<class T>
void List<T>::print()
{
curr = head;
while(curr->next != tail){
curr = curr->next;
cout<<curr->data<<endl;
}
}

//listNode constructor
template<class T>
List<T>::listNode::listNode(T newdata):data(newdata),next(NULL),prev(NULL)
{}

我得到的错误如下:

error: 'listNode' does not name a type.

我尝试了类似故障排除帖子中提供的不同建议,但我仍然收到此错误。我有一个包含 List.cpp 的 main.cpp,但它实际上是空的。

最佳答案

您将必须指定哪个 listNode你说的是 find方法的返回类型,因为您将其定义为 List 的成员类,你也将不得不使用 typename (因为 List<T> 是一个从属范围)。

template <class T>
typename List<T>::listNode* List<T>::find(listNode* place, int k)
{
if ((k == 0) || (place == NULL))
return place;
else
return find(place->next, k-1);
}

假设您使用的是 c++11,您可能还想使用 nullptr而不是 NULL因为它更安全并使用 List 处的初始化列表构造函数。

关于C++ 不命名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14727580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com