具有嵌套类声明的类模板 (C++)
Posted
技术标签:
【中文标题】具有嵌套类声明的类模板 (C++)【英文标题】:Class Template with Nested Class Declaration (C++) 【发布时间】:2020-01-28 20:42:50 【问题描述】:假设一个名为 Queue
的类模板带有一个嵌套类 Node
(不是类模板):
template<typename T>
class Queue
private:
struct Node
Node (T value) : value(value), next(nullptr)
Node (T value, Node* next) : value(value), next(next)
T value;
Node* next;
;
Node* head;
size_t sz;
void cleanList();
public:
Queue();
Queue(const Queue& st);
Queue& operator=(const Queue& st);
~Queue();
size_t size() const noexcept;
bool isEmpty() const noexcept;
T& front();
const Tt& front() const;
void enqueue(const T& elem);
void dequeue();
;
我可以这样做:
template<typename T>
void Queue<T>::enqueue(const T& elem)
Node* temp = new Node(elem);
它可以编译,但为什么声明 Node
不需要更多信息? (如Queue::Node
)
阅读Templates and nested classes/structures后,所有这3个也可以工作并编译:
template<typename T>
void Queue<T>::enqueue(const T& elem)
typename LLQueue<Object>::Node* temp1 = new Node(elem);
LLQueue<Object>::Node* temp2;
LLQueue::Node* temp3;
为什么所有版本都有效?在类模板中使用嵌套类时首选哪个?
【问题讨论】:
【参考方案1】:它可以编译,但为什么声明
Node
不需要更多信息?
这就是在成员函数范围内进行非限定名称查找的方式。首先编译器检查函数的范围,没有找到任何东西,然后进入类范围。在类范围内,它看到了Node
,因此名称查找成功并且您获得了属于该类成员的Node
类型。
为什么所有版本都有效?
C++ 让您可以随心所欲地表达。任何名称都可以是完全限定的,这就是您正在做的事情。使用typename LLQueue<Object>::Node
,不需要typename
,但它不会伤害任何东西。就像做struct foo; struct foo f;
一样,struct
不是必需的,但语法允许。带有LLQueue<Object>::Node
的第二行只是一种不太明确的方式,也允许使用,因为实际上并不需要typename
。 LLQueue::Node
有效,因为在类模板中class_name
被注入到类作用域中,它是class_name<template_params>
。
【讨论】:
以上是关于具有嵌套类声明的类模板 (C++)的主要内容,如果未能解决你的问题,请参考以下文章
C++中,一个类模板的内部又嵌套了一个类模板,语法应该是怎么样的