在没有模板参数的类模板中使用类名
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 }; };
—结束示例 ]
这基本上是为了方便起见,因此类中的类名引用类本身,而不是可能具有相同名称的任何外部内容。对于类模板,如果您有很长的模板参数列表,它可能会节省大量键入。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用