首页 > 解决方案 > 为什么我在声明本身中收到“未在范围内声明”错误?

问题描述

我正在尝试为 cout 和我的自定义链表类重载 << 运算符。但是,在 LinkedList.hpp LinkedList<T>::Node* ptr = list.getHead();( 我错过了什么吗?

这是代码:

// LinkedList.hpp

#ifndef LINKED_LIST_HPP
#define LINKED_LIST_HPP

#include <stdexcept>
#include <iostream>

template <typename T>
class LinkedList {
    public:
        class Node {
            private:
                T _data;
                Node* _next;
            public:
                Node(T data);
                T getData();
                Node* getNext();
        };
        LinkedList();
        ~LinkedList();
        int size();
        LinkedList<T>::Node* getHead();
    private:
        LinkedList<T>::Node* _head;
        int _size;
};

template <typename T>
std::ostream& operator<<(std::ostream& strm, LinkedList<T>& list);

#include "LinkedList.cpp"
#endif



// LinkedList.cpp

template <typename T>
LinkedList<T>::Node::Node(T data) {
    _data = data;
    _next = nullptr;
}

template <typename T>
T LinkedList<T>::Node::getData() {
    return _data;
}

template <typename T>
typename LinkedList<T>::Node* LinkedList<T>::Node::getNext() {
    return _next;
}

template <typename T>
LinkedList<T>::LinkedList() {
    _head = nullptr;
    _tail = nullptr;
    _size = 0;
}

template <typename T>
LinkedList<T>::~LinkedList() {
    Node* ptr = _head;
    while (ptr != nullptr) {
        _head = _head->getNext();
        delete ptr;
        ptr = _head;
    }
}

template <typename T>
int LinkedList<T>::size() {
    return _size;
}

template <typename T>
typename LinkedList<T>::Node* LinkedList<T>::getHead() {
    return _head;
}

template <typename T>
std::ostream& operator<<(std::ostream& o, LinkedList<T>& list) {
    if (list.size() == 0) {
        o << "NULL";
    }
    else {
        LinkedList<T>::Node* ptr = list.getHead();
        while (ptr->getNext() != nullptr) {
            o << ptr->getData() << " -> ";
        }
        o << ptr->getData();
    }
    return o;
}

标签: c++

解决方案


这似乎Node是一个依赖类型的问题,因此您需要这样做:

typename LinkedList<T>::Node* ptr = list.getHead();

有关何时需要以及为什么需要的更多详细信息,请参阅此答案:我必须在哪里以及为什么必须放置“模板”和“类型名”关键字?


推荐阅读