c++ - 在没有模板参数的类模板中使用类名

标签 c++ templates

代码来自一本C++书籍如下:

为什么这个公共(public)成员 Link* next 没有类型名参数?

template <typename E> class Link {
private:
    static Link<E>* freelist;
public:
    E element;
    Link* next;  // this line confused me....

    Link(const E& elemval, Link* nextval = NULL)
    {
        element = elemval; next = nextval;
    }
    Link(Link* nextval = NULL) { next = nextval; }
    void* operator new(size t){
        if (freelist == NULL) return ::new Link;
        Link<E>* temp = freelist;
        freelist = freelist->next;
        return temp; // Return the link
    }
};

我觉得应该是Link<E>* next .

请告诉我它没有模板参数的原因。

最佳答案

这被称为“注入(inject)的类名”。该规则具体来自[temp.local]:

Like normal (non-template) classes, class templates have an injected-class-name (Clause 9). The injected-class- name can be used as a template-name or a type-name. When it is used with a template-argument-list, as a template-argument for a template template-parameter, or as the final identifier in the elaborated-type-specifier of a friend class template declaration, it refers to the class template itself. Otherwise, it is equivalent to the template-name followed by the template-parameters of the class template enclosed in <>.

Within the scope of a class template specialization or partial specialization, when the injected-class-name is used as a type-name, it is equivalent to the template-name followed by the template-arguments of the class template specialization or partial specialization enclosed in <>. [ Example:

template<template<class> class T> class A { };
template<class T> class Y;
template<> class Y<int> {
    Y* p;                                // meaning Y<int>
    Y<char>* q;                          // meaning Y<char>
    A<Y>* a;                             // meaning A<::Y>
    class B {
        template<class> friend class Y;  // meaning ::Y
    };
};

—end example ]

这基本上是为了方便起见,因此类中的类名指的是类本身,而不是任何可能具有相同名称的外部内容。对于类模板,如果模板参数列表很长,它可能会节省大量输入。

关于c++ - 在没有模板参数的类模板中使用类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39847598/

相关文章:

c++ - 如何使用 STL 在 C++ 中创建游戏保存文件格式

java - fatal error : jni_md. h:没有这样的文件或目录#include "jni_md.h"

c++ - char* 和 char[N] 的模糊错误

c++ - 如果使用特定特化,则编译失败

C++ 模板过度使用

c++ - 基于 OAuth 的身份验证方案

c++ - c++ 按降序对 vector 进行排序

c++ - std::sort 函数给出 "Bus error: 10"

grails - 在Grails中渲染HTML文件

c++ - 如何使这个带有可变参数的模板特化成为类的 friend ?