Class 带有嵌套 Class 声明的模板 (C++)
Class Template with Nested Class Declaration (C++)
鉴于名为 Queue
的 class 模板带有嵌套 class Node
(不是 class 模板):
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;
}
为什么所有版本都有效?在 class 模板中使用嵌套 class 时首选哪个?
It compiles, but why does declaring a Node
not need more information?
这就是在成员函数范围内进行非限定名称查找的方式。首先,编译器检查函数的作用域,没有找到任何东西,然后转到 class 作用域。在 class 范围内,它看到 Node
,因此名称查找成功并且您获得 class.
成员的 Node
类型
Why do all versions work?
C++ 可以让您尽可能明确。任何名称都可以是完全限定的,这就是您正在做的。对于 typename LLQueue<Object>::Node
,不需要 typename
,但它不会造成任何伤害。就像做 struct foo{}; struct foo f;
不需要 struct
但语法允许这样做。带有 LLQueue<Object>::Node
的第二行只是一种不太明确的方式,也是允许的,因为实际上并不需要 typename
。 LLQueue::Node
有效是因为在 class 模板中 class_name
被注入到 class 范围并且它是 class_name<template_params>
.
鉴于名为 Queue
的 class 模板带有嵌套 class Node
(不是 class 模板):
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;
}
为什么所有版本都有效?在 class 模板中使用嵌套 class 时首选哪个?
It compiles, but why does declaring a
Node
not need more information?
这就是在成员函数范围内进行非限定名称查找的方式。首先,编译器检查函数的作用域,没有找到任何东西,然后转到 class 作用域。在 class 范围内,它看到 Node
,因此名称查找成功并且您获得 class.
Node
类型
Why do all versions work?
C++ 可以让您尽可能明确。任何名称都可以是完全限定的,这就是您正在做的。对于 typename LLQueue<Object>::Node
,不需要 typename
,但它不会造成任何伤害。就像做 struct foo{}; struct foo f;
不需要 struct
但语法允许这样做。带有 LLQueue<Object>::Node
的第二行只是一种不太明确的方式,也是允许的,因为实际上并不需要 typename
。 LLQueue::Node
有效是因为在 class 模板中 class_name
被注入到 class 范围并且它是 class_name<template_params>
.