世时进 2022-01-20 09:19 采纳率: 0%
浏览 31

我这个代码编译器说有一个无法解析的外部符号,好像和重载运算符有关,但我不知道怎么改


#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;
    
}
  • 写回答

1条回答 默认 最新

  • _GX_ 2022-01-20 09:37
    关注

    第30行改为

        template <typename T1>
        friend ostream& operator <<(ostream& os, const SList<T1>& list);
    
    评论

报告相同问题?

问题事件

  • 创建了问题 1月20日

悬赏问题

  • ¥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,如何解決?