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

Mak*_*oto 11 c++ templates

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

为什么这个公共成员Link*next没有typename参数?

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
    }
};
Run Code Online (Sandbox Code Playgroud)

我认为应该是Link<E>* next.

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

Bar*_*rry 17

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

与普通(非模板)类一样,类模板具有注入类名(第9节).所述注入-类-名称可被用作模板名称类型名称.当它与template-argument-list一起使用时,作为模板模板参数的模板参数,或作为 友元类模板声明的详细类型说明符中的最终标识符,它引用类模板本身.否则,它等同于template-name,后跟括在其中的类模板的template-parameters<>.

在类模板特化或部分特化的范围内,当inject-name-name用作类型名称时,它等同于template-name,后跟类模板特化或部分特化的模板参数在<>.[例如:

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
    };
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

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

  • @Makoto在`template <typename E> class Link {...};`,是的. (2认同)