#include <iostream>
#include <memory.h>
using namespace std;
template<typename T>class SList;
template <typename T>
class Node
{
friend class SList<T>;
T m_data;
Node* m_next = nullptr;
public:
Node(const T&val):m_data(val){ }
const T& data()const { return m_data; }
T& data() { return m_data; }
Node* next() { return m_next; }
Node(const Node& rhs) = delete;
Node& operator=(const Node& rhs) = delete;
};
template<typename T>
ostream& operator<<(ostream& os, const SList<T>& list);
template <typename T>
class SList
{
friend ostream& operator <<(ostream& os, const SList<T>& list);
Node<T>* m_head = nullptr, * m_tail = nullptr;
public:
SList() = default;
~SList();
void clear();
void push_back(const T& val);
Node<T>* insert(Node<T>* pos, const T& val);
Node<T>* find(const T& val);
void erase(const T& val);
SList(const SList&) = delete;
SList& operator=(const SList&) = delete;
};
template <typename T>
void SList<T>::push_back(const T& val)
{
Node<T>* node = new Node<T>(val);
if (m_head == nullptr)
m_head = m_tail = node;
else
{
m_tail->m_next = node;
m_tail = node;
}
}
template <typename T>
Node<T>* SList<T>::insert(Node<T>* pos, const T& val)
{
Node<T>* node = new Node<T>(val);
node->m_next = pos->m_next;
pos->m_next = node;
if (pos == m_tail)
m_tail = node;
return node;
}
template <typename T>
Node<T>* SList<T>::find(const T& val)
{
Node<T>* p = m_head;
while (p != nullptr && p->m_data != val)
p = p->m_next;
return p;
}
template <typename T>
void SList<T>::erase(const T& val)
{
Node<T>* p = m_head, * q = p;
while (p != nullptr && p->m_data != val)
{
q = p;
p = p->m_next;
}
if (p)
q->m_next = p->m_next;
if (p == m_tail)
m_tail = q;
if (p == m_head)
m_head = nullptr;
delete p;
}
template <typename T>
void SList<T>::clear()
{
Node<T>* p = nullptr;
while (m_head != nullptr)
{
p = m_head;
m_head = m_head->m_next;
delete p;
}
m_tail = nullptr;
}
template<typename T>
SList<T>::~SList()
{
clear();
}
template <typename T>
ostream& operator <<(ostream& os, const SList<T>& list)
{
Node<T>* p = list.m_head;
while (p != nullptr)
{
os << p->data() << " ";
p = p->next();
}
return os;
}
int main()
{
int val;
SList<int>l;
l.push_back(20);
cout << l << endl;
}
我这个代码编译器说有一个无法解析的外部符号,好像和重载运算符有关,但我不知道怎么改
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- _GX_ 2022-01-20 09:37关注
第30行改为
template <typename T1> friend ostream& operator <<(ostream& os, const SList<T1>& list);
解决 无用评论 打赏 举报
悬赏问题
- ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
- ¥15 如何在scanpy上做差异基因和通路富集?
- ¥20 关于#硬件工程#的问题,请各位专家解答!
- ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
- ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
- ¥30 截图中的mathematics程序转换成matlab
- ¥15 动力学代码报错,维度不匹配
- ¥15 Power query添加列问题
- ¥50 Kubernetes&Fission&Eleasticsearch
- ¥15 報錯:Person is not mapped,如何解決?