CRTP场景下含模板派生类的基类模板偏特化问题
解决CRTP基类针对派生类模板参数的偏特化问题
错误原因分析
你尝试的特化版本中,第二个模板参数C<Word<T>>是类模板C实例化后的具体类类型,但BaseView的第二个模板参数要求的是类模板本身(template<class> class C),两者类型不匹配,因此GCC报错。
修正方案
调整特化的模板参数匹配逻辑,直接针对「第一个参数是Word<T>、第二个参数是任意类模板C」的情况编写特化:
#include "iostream" using namespace std; template<class T> class Word; template<class T, template<class> class C> class BaseView { public: BaseView() { cout << "normal BaseView" << endl; } }; // 正确的偏特化:匹配第一个参数为Word<T>、第二个为类模板C的情况 template<class T, template<class> class C> class BaseView<Word<T>, C> { public: BaseView() { cout << "BaseView specialized on Word" << endl; } }; template<class T> class A: public BaseView<T,A> { public: A():BaseView<T,A>() {} }; int main() { A<A<Word<int>> > a0; // 输出 normal BaseView A<Word<int>> a1; // 输出 BaseView specialized on Word }
效果说明
a0的类型是A<A<Word<int>>>,其基类BaseView<A<Word<int>>, A>的第一个参数不是Word<T>,因此使用普通版本的BaseView。a1的类型是A<Word<int>>,其基类BaseView<Word<int>, A>匹配偏特化条件,因此使用特化版本的BaseView。
内容的提问来源于stack exchange,提问作者ritter
相关产品推荐
相关产品推荐

