我对CRTP和大量模板化代码是新手,所以我不确定这是否可能。。。
我有一个模板类,如下所示:
模板<类型名。。。时间>类base_type_components{公众:模板<std::size_ti>标准::tuple_element_t组件(){return std::get<i>(_components);}constexpr标准::size_tnum_components()常量{返回sizeof。。。(T) ;}私人:std::元组<T…>_components;};
这个父类接受一个类型列表,并为“组件存储”生成一个元组。
我可以通过调用访问这些组件x.组件<0>()
,&c。然而,我的子类也是一个模板,所以我实际上使用此->模板组件()
内部。
我的子类定义如下:
模板<std::size_t L=199>类类型_驱动_集:公共base_type_components{公众:标准::字符串value()常量{返回此->模板组件<0>();}...};
这个类也是一个模板。模板参数L(左)
在其他与问题无关的代码中使用。
问题在于的返回语句type_derived_st<L>::value
.
当我将类实例化为类型_驱动_ st<5>
并尝试运行价值
函数,我得到以下编译时错误:
错误:无法转换'常量type_derived_st<5>*'
到'base_type_components<std::__cxx11::basic_string<char,std:
我不明白是什么阻止了转换?
如果我执行以下操作:
类型_驱动_ st<5>x;标准::字符串s=x.component<0>();
然后它就完美地工作了。只有当我尝试在内部将函数调用到模板派生类时,才会发生此错误:
类型_驱动_ st<5>x;标准::字符串s=x.value();//错误!
MRE公司:
#包括<cstddef>#包括<string>#包含<元组>模板<类型名。。。时间>类base_type_components{公众:模板<std::size_ti>标准::tuple_element_t组件(){return std::get<i>(_components);}constexpr标准::size_tnum_components()常量{返回sizeof。。。(T) ;}私人:std::元组<T…>_components;};模板<std::size_t L=199>类类型_驱动_集:公共base_type_components{公众:type_derived_st()=默认值;~type_derived_st()=默认值;标准::字符串value()常量{返回此->模板组件<0>();}};整数main(){type_derived_st<5>x;标准::字符串y=x.value();返回0;}