Warm tip: This article is reproduced from serverfault.com, please click

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

(c++ - using class name in a class template without template parameters)

发布于 2015-06-17 12:09:36

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

为什么此公共成员Link *接下来没有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
    }
};

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

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

Questioner
Makoto
Viewed
0
Barry 2015-06-17 20:21:37

这就是所谓的“注入类名”。该规则特别来自[temp.local]:

像普通(非模板)类一样,类模板也具有注入的类名(第9条)。所述注入-类-名称可被用作模板名称类型名称当它被用来与一个模板参数列表,作为模板的参数为模板模板参数,或者作为最后的标识符阐述型说明符 朋友类模板声明的,它指的是类模板本身。否则,它等效于template-name,后跟包含的类模板的template-parameters<>

在类模板专业化或部分专业化的范围内,当将injection-class-name用作type-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
    };
};

—结束示例]

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