【问题标题】:Template as Parameter Type模板作为参数类型
【发布时间】:2013-11-12 08:53:39
【问题描述】:

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 模板的构造函数外壳。

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

【问题讨论】:

  • LLNode&lt;T&gt; *first, *last;
  • 一旦你解决了 LLNode 问题,你会发现你还有另一个问题,循环包含。 Nodes.h 包含 LinkedList.h,它再次包含 Nodes.h。那是行不通的。
  • 注意“#pragma once”
  • 我还修复了所有定义的 问题,但这并不能解决 LLNode 构造函数的问题
  • @user2982397 是的,因为你有循环包含,#pragma once 不能解决这个问题。最好将所有内容放在一个头文件中,但仍然很棘手。

标签: c++ function templates member


【解决方案1】:

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

 LLNode<T>* first;

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

等等。

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

【讨论】:

  • 我注意到这是对后续问题的修复,但它不能解决与 LLNode 构造函数的直接链接问题
  • @user2982397 你不应该有链接问题:模板实现必须在头文件中可用。
  • 循环包含是一个潜在的问题,但如果模板允许外部定义,这不会是一个问题。即使我将它们重新排序到一个文件等中,一个仍然在另一个之前编译,所以我不能同时使用两个模板,除非我将一个模板定义为另一个内部定义的子类(我宁愿不这样做)
  • @user2982397 我确信通过一些前向声明以及对类定义和类成员函数定义的一些仔细排序,您可以让它工作,所有代码都在一个文件中(或通过包含)。
【解决方案2】:

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

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

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

LLNode<T>* first;

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

template<typename T>
class LinkedList;

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

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

不,#pragma once 或包含守卫对此无济于事,因为LinkedList 需要在LinkedList 之前声明LLNode,反之亦然。

【讨论】:

  • 不幸的是,这并没有解决第一个问题:'LLNode(T _data, LinkedList* parent);'仍然出现编译时错误
  • @user2982397 你有一个循环依赖问题,更新了我的答案以包含它。
猜你喜欢
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多