模板类的规范和继承

时间:2019-07-16 11:31:44

标签: c++ class templates inheritance template-specialization

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”。我在哪里做错了?

2 个答案:

答案 0 :(得分:2)

这是类模板Base的显式专业化。

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

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

来自C ++ 20 Standard(13.8.3显式专业化)

  
      
  1. 显式专门类的成员未隐式实例化   从类模板的成员声明中;而是成员   类模板专门化的本身应明确   定义是否需要定义。 ...的定义   明确的专业课与   生成的专业化的定义。也就是说,其成员   不必与a的成员具有相同的名称,类型等   产生专业化。专门班的成员   模板的定义方式与普通类的成员相同,   而不使用template <>语法....
  2.   

答案 1 :(得分:1)

类模板的显式专业化将完全替换该特定模板参数集的主模板。在您的情况下,这意味着Base<int>与没有专业化的情况下从Base<T>生成的内容毫无关系。显式专门化定义是专门化模板参数的类的 complete 定义。

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

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;}
};