模板类规范和固有性
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 显式专业化(
- 显式专用类的成员不会隐式实例化 来自类模板的成员声明;相反,成员 的类模板专用化本身应明确 定义(如果需要其定义(。...定义 显式专用类与 生成的专业化的定义。也就是说,它的成员 不必具有与成员相同的名称、类型等 生成专业化。显式专用类的成员 模板的定义方式与普通类的成员相同, 并且不使用模板<>语法....
类模板的显式专用化完全取代了该特定模板参数集的主模板。在您的情况下,这意味着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;}
};