C++类模板成员函数偏特化为纯虚函数报错原因及实现方案
模板类特化成员为纯虚函数的错误分析与解决
原模板类定义
template<typename T> class my_class { virtual void my_func(int i); };
错误的特化尝试
想要针对ExcistingClass特化my_func为纯虚函数,写出了以下代码:
template<> my_class<ExcistingClass>::my_func(int i) = 0;
编译器报错:
error C2988: unrecognizable template declaration/definition error C2059: syntax error : '='
错误原因
- C++语法规则明确:纯虚函数的
=0声明只能放在类内部的成员声明里,不能在类外部的函数特化语句中直接使用。 - 要修改模板类某特化版本中成员函数的性质(从普通虚函数改为纯虚),不能只单独特化成员函数,必须先特化整个类模板,再在特化类的内部重新定义该成员的属性。
正确实现方法
必须先特化整个my_class模板,然后在特化类内部将my_func声明为纯虚函数:
// 特化整个类模板 template<> class my_class<ExcistingClass> { // 在特化类内部声明为纯虚函数 virtual void my_func(int i) = 0; };
如果原模板类还有其他成员需要保留,要在特化类中逐一重新声明或定义(因为类模板特化是完全独立的定义,不会自动继承原模板的成员)。示例如下:
// 原模板类 template<typename T> class my_class { virtual void my_func(int i); void other_func(); // 原模板的其他成员 }; // 针对ExcistingClass的特化类 template<> class my_class<ExcistingClass> { virtual void my_func(int i) = 0; // 修改为纯虚 void other_func(); // 重新声明原模板的其他成员 };
内容的提问来源于stack exchange,提问作者Vahag Chakhoyan
相关产品推荐
相关产品推荐

