为什么在gcc / libstdc ++中的__enable_shared_from_this_helper中没有模板参数

时间:2014-12-03 12:36:20

标签: c++ shared-ptr libstdc++

我正在读取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?

2 个答案:

答案 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     }