我正在读取enable_shared_from_this的stl代码,它位于gcc-4.9.2 \ libstdc ++ - v3 \ include \ bits \ shared_ptr.h中。然后我看到了这个:
template<typename _Tp1>
friend void
__enable_shared_from_this_helper(const __shared_count<>& __pn,
const enable_shared_from_this* __pe,
const _Tp1* __px) noexcept
{
if (__pe != 0)
__pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
}
我的问题是,为什么 const enable_shared_from_this * __pe 没有模板参数?当shared_ptr构造函数使用指向A类的指针调用__enable_shared_from_this_helper时,它是如何工作的,其中A派生自enable_shared_from_this?
答案 0 :(得分:3)
这是在enable_shared_from_this
的定义中定义的。在类模板的定义中,模板名称也是注入的类名,可以无限制地使用,以引用实例化的任何特化。
答案 1 :(得分:3)
这称为注入的类名。 C ++标准允许这例如在14.6.1:
中与普通(非模板)类一样,类模板也有 注入类名(第9条)。可以使用注入类名 作为模板名称或类型名称。与它一起使用时 template-argument-list,作为模板的模板参数 模板参数,或作为精心制作的最终标识符 - 朋友类模板声明的说明符,它指的是 类模板本身。 否则,它相当于 template-name后跟类的模板参数 括在&lt;&gt;。
中的模板
如果查看 shared_ptr_base.h 的源代码,可以看到模板参数是必需的,因为它是类:
00730 // Friend of __enable_shared_from_this.
00731 template<_Lock_policy _Lp, typename _Tp1, typename _Tp2>
00732 void
00733 __enable_shared_from_this_helper(const __shared_count<_Lp>&,
00734 const __enable_shared_from_this<_Tp1,
00735 _Lp>*, const _Tp2*);
但是在 shared_ptr.h 中,该类的定义 :
00473 template<typename _Tp>
00474 class enable_shared_from_this
00475 {
...
00502 template<typename _Tp1>
00503 friend void
00504 __enable_shared_from_this_helper(const __shared_count<>& __pn,
00505 const enable_shared_from_this* __pe,
00506 const _Tp1* __px)
00507 {
00508 if (__pe != 0)
00509 __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
00510 }