加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 带有基类的CRTP试图获取派生类成员的返回类型:无效使用不

发布时间:2020-12-16 07:05:11 所属栏目:百科 来源:网络整理
导读:请考虑以下代码(仅用于示例目的): #include iostream#include type_traits#include arraytemplate class Crtp,class Vector = typename std::decaydecltype(std::declvalCrtp().data())::type,class Scalar = typename std::decaydecltype(std::declvalCrtp
请考虑以下代码(仅用于示例目的):

#include <iostream>
#include <type_traits>
#include <array>

template <
class Crtp,class Vector = typename std::decay<decltype(std::declval<Crtp>().data())>::type,class Scalar = typename std::decay<decltype(std::declval<Crtp>().data(0))>::type
>
struct Base
{;};

template <
class Vector = std::array<double,3>,class Scalar = typename std::decay<decltype(std::declval<Vector>()[0])>::type
>
struct Derived
: public Base<Derived<Vector,Scalar>>
{
    Vector _data;
    inline Vector& data() {return _data;}
    inline const Vector& data() const {return _data;}
    inline Scalar& data(const unsigned int i) {return _data[i];}
    inline const Scalar& data(const unsigned int i) const {return _data[i];}
};

int main()
{
    Derived<> d;
    return 0;
}

它返回以下错误:

main.cpp: In instantiation of 'struct Derived<>':
main.cpp:28:14: required from here
main.cpp:16:8: error: invalid use of incomplete type 'struct Derived<>'
main.cpp:16:8: error: declaration of 'struct Derived<>'

有没有办法解决这个问题(不使用typedef,只使用模板)?

解决方法

这非常混乱,因为当Base的模板参数推断发生时,Derived不完整.我假设显而易见的答案 – 明确地传递Vector和Scalar–是不能令人满意的.怎么样:

template <template <class,class> class Derived,class Vector,class Scalar>
struct Base {};

template <class Vector,class Scalar>
struct Derived : Base<Derived,Vector,Scalar> {};

为什么不使用typedef的奇怪限制?我发现:

template <class Vector>
using ScalarTypeOf =
  typename std::decay<decltype(std::declval<Vector>()[0])>::type;

template <class Crtp>
using VectorTypeOf =
  typename std::decay<decltype(std::declval<Crtp>().data())>::type;

template <class Crtp>
struct Base {
  using Vector = VectorTypeOf<Crtp>;
  using Scalar = ScalarTypeOf<Vector>;
};

template <class Vector>
struct Derived : public Base<Derived<Vector>> {
  using Scalar = ScalarTypeOf<Vector>;
};

更具可读性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读