有关模板和类型名的问题

时间:2019-02-26 11:15:54

标签: c++ c++17

我找到了这篇文章: https://tristanbrindle.com/posts/beware-copies-initializer-list 我对所提供的部分代码有疑问:

第一页:
我认为这与从属名称有关,但是我不确定这部分的目的是什么

 template <typename T>
    typename instance_counter<T>::counter instance_counter<T>::icounter{};

第二个:

template <typename T>
struct counted : T, private instance_counter<T>
{
    using T::T;
};

有人可以给我解释这些代码吗?

1 个答案:

答案 0 :(得分:3)

  

有人可以给我解释这些代码吗?

template <typename T>
typename instance_counter<T>::counter instance_counter<T>::icounter{};

这是instance_counter模板中声明的静态变量的初始化(请参阅博客文章中的static struct counter { /* ... */ } icounter;)。有关静态数据成员的初始化的更多信息,请参见this thread。该定义引用模板的嵌套名称(counter),并且编译器默认将其视为值的名称,而不是类型。要更改此默认解释,您需要在typename之前加上前缀。有关详细信息,请参见this thread

template <typename T>
struct counted : T, private instance_counter<T>
{
    using T::T;
};

在这里,模板countedT公开继承(public的继承是struct的默认继承),私有地从instance_counter<T>继承。公共继承部分与using T::T(带来T的所有ctor重载)一起用于提供与实例化模板的类相同的接口(例如,帖子中的string )。私有继承部分表示是在术语中实现的,并确保为新实例化的类类型引入instance_counter机制,并在析构函数中生成输出。