gpt4 book ai didi

c++ - 将类重新定义为不同种类的符号

转载 作者:行者123 更新时间:2023-11-30 04:45:38 24 4
gpt4 key购买 nike

template <typename T>
class LinkedListNode {
public:
friend class LinkedList;
friend class LinkedListIterator;

LinkedListNode(const T p_data) : data(p_data), next(nullptr) {}

~LinkedListNode() {
std::cout << "~LinkedListNode()\n";
}

private:
T data;

LinkedListNode<T>* next;
};

template <typename T>
class LinkedList { /* Redefinition of 'LinkedList' as different kind of symbol */
...
}

我制作了自己的链表数据结构,但是出现错误信息到LinkedList类。

如果我尝试编译代码,则会发生另一个错误。

error: template argument required for ‘class LinkedList’
class LinkedListNode {
^


error: template placeholder type ‘LinkedListNode’ must be followed by a simple declarator-id
LinkedListNode* pre_remove;
^~~~~~~~~~~~~~

我添加了 template <typename T>以上LinkedList类,所以我不明白为什么会出现这些错误消息。

int main() {
LinkedList li;
...
}

----------------------------------------------------
error: class template argument deduction failed:
LinkedList li;
^~

Full source code of Linked List

最佳答案

正如 dorKKnight 所暗示的那样, class LinkedList 其实就是一个模板。因此,您必须这样使用它——即使在 friend 声明中也是如此。

template <typename T>
class LinkedListNode {
friend class LinkedList<T>;

故事的另一部分是 LinkedListLinkedListNode 有循环依赖。要打破这一点,需要模板前向声明。

// forward declaration
template <typename T>
class LinkedList;

一个完整的样本:

// forward declaration
template <typename T>
class LinkedList;

template <typename T>
class LinkedListNode {
friend class LinkedList<T>;
public:
const T value;
private:
LinkedListNode *pNext;
public:
LinkedListNode(const T value): value(value), pNext(nullptr) { }
~LinkedListNode() = default;

};

template <typename T>
class LinkedList {
LinkedListNode<T> *pFirst, *pLast;

public:
LinkedList(): pFirst(nullptr), pLast(nullptr) { }

void push(const T value)
{
if (!pFirst) pFirst = pLast = new LinkedListNode<T>(value);
else {
pLast->pNext = new LinkedListNode<T>(value);
pLast = pLast->pNext;
}
}
void print(const char *sep = " ")
{
std::cout << "{";
for (LinkedListNode<T> *pNode = pFirst; pNode; pNode = pNode->pNext) {
std::cout << sep << pNode->value;
}
std::cout << sep << "}";
}
};

int main()
{
LinkedList<int> list;
list.push(1); list.push(2); list.push(3);
list.print();
}

输出:

{ 1 2 3 }

Live Demo on coliru


设计问题:

通常将单个节点的类嵌入到列表的模板类中,因为节点类是不需要在其他任何地方“看到”的列表详细信息。

重新设计上面的示例:

#include <iostream>

template <typename T>
class LinkedList {

private:
struct Node {
const T value;
Node *pNext;

Node(const T value): value(value), pNext(nullptr) { }

};

Node *pFirst, *pLast;

public:
LinkedList(): pFirst(nullptr), pLast(nullptr) { }

void push(const T value)
{
if (!pFirst) pFirst = pLast = new Node(value);
else {
pLast->pNext = new Node(value);
pLast = pLast->pNext;
}
}
void print(const char *sep = " ")
{
std::cout << "{";
for (Node *pNode = pFirst; pNode; pNode = pNode->pNext) {
std::cout << sep << pNode->value;
}
std::cout << sep << "}";
}
};

int main()
{
LinkedList<int> list;
list.push(1); list.push(2); list.push(3);
list.print();
}

输出:

{ 1 2 3 }

Live Demo on coliru

作为奖励,远期问题已经消失。

关于c++ - 将类重新定义为不同种类的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57156549/

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