【问题标题】:template class specification and inhertiance模板类规范和继承
【发布时间】:2019-11-25 03:11:47
【问题描述】:
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 未在命名空间中声明”的错误。我哪里做错了?

【问题讨论】:

  • 当 T 是 int 时,编译器选择特化,即使用的 Base 的整个实现。对于所有其他类型,它使用主模板。它们不会合并,只是其中之一。

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


【解决方案1】:

它是类模板Base 的显式特化。

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

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

来自 C++ 20 标准(13.8.3 显式特化)

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

【讨论】:

  • 是否需要将class Base : public CommonBase&lt;T&gt; 中的所有成员都包含到class Base&lt;int&gt; : public CommonBase&lt;int&gt;中?
  • @IgorG 仔细看看 :)
  • @SteveYang 你必须定义类 Base 的特化。
【解决方案2】:

类模板的显式特化完全替换该特定模板参数集的主模板。在您的情况下,这意味着 Base&lt;int&gt;Base&lt;T&gt; 在没有专业化的情况下生成的内容没有任何关系。显式特化定义是特化模板参数的类的完整定义。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多