3

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);
};

现在,问题是无论我做什么,我似乎都无法解决以下错误:关于 LLNode 模板的构造函数 shell 的“错误 C2601:语法错误:标识符 'LinkedList'”。

我的主要问题是,如果可能的话,你如何使用模板类作为参数类型,我忽略了哪些语法错误?

4

2 回答 2

2

首先,LLNode是一个类模板,所以你需要

 LLNode<T>* first;

void insert(LLNode<T>* node, int index);

等等。

Nodes.h其次,您在和之间有一个循环包含依赖关系LinkedList.h。您将不得不重新设计您的代码,使这些类不相互依赖,或使用前向声明。您可能必须尝试放置包含的位置,这是实现成员函数所必需的。我建议重新设计。

于 2013-11-12T08:56:11.103 回答
1

您需要使用模板类型LLNode,例如

void insert(LLNode<T>* node, int index);

以及使用模板类型声明成员变量:

LLNode<T>* first;

您还有一个循环包含依赖项。头文件Nodes.h需要LinkedList.h哪些需要Nodes.h等。您可以通过在头文件中声明 来克服它,而不是当前包含头文件:LinkedListNodes.hLinkedList.h

template<typename T>
class LinkedList;

template<typename T>
class LLNode
{
    ...
};

无论如何,您可能必须包含LinkedList.h头文件Nodes.h,具体取决于您如何使用节点类中的列表类。

不,#pragma onceor 包含守卫对此没有帮助,因为LinkedList需要LLNode在之前声明,LinkedList反之亦然。

于 2013-11-12T08:55:52.133 回答