该代码来自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
。
请告诉我它没有模板参数的原因。
这就是所谓的“注入类名”。该规则特别来自[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 }; };
—结束示例]
这基本上是为了方便起见,因此该类中的类名称是指该类本身,而不是指可能具有相同名称的任何外部名称。对于类模板,如果模板参数列表很长,它可能会节省很多输入时间。
所以等价于Link <E> *接下来和Link *接下来吗?
@Makoto内
template <typename E> class Link { ... };
,是的。