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

using class name in a class template without template parameters

本文关键字:参数      更新时间:2023-10-16

代码来自一本C++书,如下所示:

为什么这个公共成员 Link* 接下来没有类型名参数?

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.

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

称为"注入的类名"。该规则具体来自 [temp.local]:

与普通(非模板)类一样,类模板具有注入的类名(条款 9)。注入类 名称可用作模板名称或类型名称。当它与模板参数列表一起使用时, 作为模板模板参数的模板参数或作为详细类型说明符中的最终标识符 在友元类模板声明中,它引用类模板本身。否则,它是等效的 到模板名称,后跟包含在 <> 中的类模板的模板参数

在类模板专用化

或部分专用化范围内,当注入的类名 用作类型名称,它等效于类的模板名称后跟模板参数 模板专用化或包含在<>中的部分专用化。[ 示例:

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
    };
};

—结束示例 ]

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