G'day伙计们,所以我决定利用UDT库的泛化来使更多的项目更容易,但是尽管我在网上搜索了我的难题的可能答案,但我对声明和具体语法都有所了解。
首先,我有以下两个shell类,都是模板:
//Nodes.h
#pragma once
#include "LinkedList.h"
template <class T>
class LLNode
{
LLNode(T _data, LinkedList* parent);
private:
T data;
LLNode* next;
};
和
//LinkedList.h
#pragma once
#include "Nodes.h"
template <class T>
class LinkedList
{
LLNode* first;
LLNode* last;
int size;
LinkedList(T data);
void insert(T data, int index);
void append(T data);
void insert(LLNode* node, int index);
void append(LLNode* node);
};
现在,问题在于无论我做什么,我似乎都无法解决以下错误: “错误C2601:语法错误:标识符'LinkedList'”关于LLNode模板的构造函数shell。
我的主要问题是,如果可能的话,你如何使用模板类作为参数类型以及我忽略了哪些语法错误呢?
答案 0 :(得分:2)
首先,LLNode
是一个类模板,所以你需要
LLNode<T>* first;
void insert(LLNode<T>* node, int index);
等等。
其次,Nodes.h
和LinkedList.h
之间存在循环包含依赖关系。您将不得不重新设计代码,使类不相互依赖,或使用前向声明。您可能必须使用包含的位置,这将是您的成员函数的实现所必需的。我建议重新设计。
答案 1 :(得分:1)
您需要使用LLNode
的模板类型,例如
void insert(LLNode<T>* node, int index);
除了使用模板类型声明成员变量:
LLNode<T>* first;
您还有一个循环包含依赖项。标题文件Nodes.h
需要LinkedList.h
,需要Nodes.h
等。您可以通过在LinkedList
标题中声明 Nodes.h
来克服它文件,而不是当前包含的LinkedList.h
头文件:
template<typename T>
class LinkedList;
template<typename T>
class LLNode
{
...
};
您可能必须在LinkedList.h
中包含Nodes.h
头文件,具体取决于您如何使用节点类中的列表类。
不,#pragma once
或包含警卫对此没有帮助,因为LinkedList
需要在LLNode
之前宣布LinkedList
,反之亦然。< / p>