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 的第二行只是一种不太明确的方式,也是允许的,因为实际上并不需要 typenameLLQueue::Node 有效是因为在 class 模板中 class_name 被注入到 class 范围并且它是 class_name<template_params>.