具有嵌套类声明的类模板 (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&lt;Object&gt;::Node,不需要typename,但它不会伤害任何东西。就像做struct foo; struct foo f; 一样,struct 不是必需的,但语法允许。带有LLQueue&lt;Object&gt;::Node 的第二行只是一种不太明确的方式,也允许使用,因为实际上并不需要typenameLLQueue::Node 有效,因为在类模板中class_name 被注入到类作用域中,它是class_name&lt;template_params&gt;

【讨论】:

以上是关于具有嵌套类声明的类模板 (C++)的主要内容,如果未能解决你的问题,请参考以下文章

C++中,一个类模板的内部又嵌套了一个类模板,语法应该是怎么样的

两级嵌套 c++ 类适用于 GCC,但使用 Clang 失败

声明嵌套类模板的静态对象

使用嵌套类作为参数的朋友模板声明

你能在 C++ 中保护嵌套类吗?

在JAVA中啥是顶级类啊