模板作为参数类型

时间:2013-11-12 08:53:40

标签: c++ function templates member

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。

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

2 个答案:

答案 0 :(得分:2)

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

 LLNode<T>* first;

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

等等。

其次,Nodes.hLinkedList.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>