c++ - 为什么我在声明本身中收到“未在范围内声明”错误?
问题描述
我正在尝试为 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;
}
解决方案
这似乎Node
是一个依赖类型的问题,因此您需要这样做:
typename LinkedList<T>::Node* ptr = list.getHead();
有关何时需要以及为什么需要的更多详细信息,请参阅此答案:我必须在哪里以及为什么必须放置“模板”和“类型名”关键字?
推荐阅读
- android - 如何在不更改其他布局的情况下更改 RecyclerView 中的单个项目
- php - 使用 $_SESSION php 的多级导航栏
- asp.net - Asp.net Webforms:为 typeform 创建 webhook 接收器
- powershell - 使用 FileSystemWatcher 在多个文件同时更改时发出警报
- python - Holoviews 热图 X 轴格式
- asp.net-mvc - .net 4.7 中的依赖注入?
- javascript - 如何使用 vanilla JavaScript 更改此 SVG 精灵的 href?
- python - 如何将 tkinter 按钮与标签和输入框保持在同一行
- snakemake - Snakemake 规则仅针对一个文件运行
- python - 在 Python 中读取 n qty 行分隔的 txt 文件