模板类规范和固有性

template class specification and inhertiance

本文关键字:固有性      更新时间:2023-10-16
template<typename T>
class CommonBase
{
};
template<typename T>
class Base : public CommonBase<T>
{
 protected:
  bool flag;
};
template<>
class Base<int> : public CommonBase<int>
{
  Base() {flag = false;}
};

它会导致错误" flag未在命名空间中声明"。我哪里做错了?

它是

类模板Base的显式专用化。

您必须在类定义中包含数据成员标志

template<>
class Base<int> : public CommonBase<int>
{
protected:
  bool flag;
public:
  Base() {flag = false;}
};

来自 C++ 20 标准(13.8.3 显式专业化(

  1. 显式专用类的成员不会隐式实例化 来自类模板的成员声明;相反,成员 的类模板专用化本身应明确 定义(如果需要其定义(。...定义 显式专用类与 生成的专业化的定义。也就是说,它的成员 不必具有与成员相同的名称、类型等 生成专业化。显式专用类的成员 模板的定义方式与普通类的成员相同, 并且不使用模板<>语法....

类模板的显式专用化完全取代了该特定模板参数集的主模板。在您的情况下,这意味着Base<int>与在没有专业化的情况下从Base<T>产生的内容无关。显式专用化定义是专用化模板参数的类的完整定义。

如果要使用主模板的某些部分并覆盖其他部分,则必须将要保留的部分提取到非专用基类中。 像这样:

template<typename T>
class CommonBase
{
};
template<typename T>
class Base_Reusable : public CommonBase<T>
{
 protected:
  bool flag;
};
template <class T>
class Base : public Base_Reusable<T>
{
};
template<>
class Base<int> : public Base_Reusable<int>
{
  Base() {flag = false;}
};