0

我对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;}
5
  • 你能发布一个最小可再现示例在一个单独的代码块中包含所有必需的include和w/o语法错误,即缺少分号?它会吸引更多愿意帮助你的人。现在编译代码需要付出太多的努力。我试过了godbolt.org/z/Pc9c9vhWv公司.你说过它工作得很好,但事实并非如此。因此,应该发布一个完整的示例。 评论 6月16日1:49
  • @3CxEZiVlQ完成。它在通话时非常有效成分直接从模板的具体实现。我添加了一个MRE,它显示了我得到的错误。PS:有一些拼写错误,但我们现在很好。
    – 聚集
    评论 6月16日1:52
  • 事实上,我甚至不确定这是CRTP,因为我已经把它删减了。
    – 聚集
    评论 6月16日1:55
  • value()是常量,但组件()是非接触的。这么简单。所有模板都是转移注意力的东西。 评论 6月16日2:01
  • @伊戈尔·坦德尼克确实。。。我想我会用常量(_C)在某些功能中。谢谢您。
    – 聚集
    评论 6月16日2:04

1答案1

重置为默认值
2

首先,这不是一个阴极射线管。在CRTP中,派生类将位于基类的模板参数中:

模板<T类>类库{};派生类:公共基<derived>{};

现在,真正的问题是你试图称之为非-常数限定函数组件<0>()来自常数限定函数value().你需要组件<0>() 常数也合格。如果您确实希望类的用户能够在,提供两个重载并通过引用返回值:

模板<类型名。。。时间>类base_type_components{公众:模板<std::size_t I>auto-const&component()const{//这将由value()使用//       ^^^^^^             ^^^^^return std::获取<I>(_components);}模板<std::size_t I>auto-component(){//此处组件I是可变的//      ^return std::获取<I>(_components);}私人:std::元组<T…>_components;};

你也不需要此->模板。只需正常调用函数并返回常数&而不是按值返回字符串。如果呼叫者想复制它,他们会复制,否则不需要复制:

模板<std::size_t L=199>类type_derived_st:public base_type_components{公众:type_derived_st()=默认值;~type_derived_st()=默认值;std::string const&value()const{返回组件<0>();}//              ^^^^^^                        ^^^^^^^^^^^^^^};

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.