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
”。我在哪里做错了?
答案 0 :(得分:2)
这是类模板Base
的显式专业化。
您必须在类定义中包括数据成员标志
template<>
class Base<int> : public CommonBase<int>
{
protected:
bool flag;
public:
Base() {flag = false;}
};
来自C ++ 20 Standard(13.8.3显式专业化)
- 显式专门类的成员未隐式实例化 从类模板的成员声明中;而是成员 类模板专门化的本身应明确 定义是否需要定义。 ...的定义 明确的专业课与 生成的专业化的定义。也就是说,其成员 不必与a的成员具有相同的名称,类型等 产生专业化。专门班的成员 模板的定义方式与普通类的成员相同, 而不使用template <>语法....
答案 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;}
};