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>; }; 更具可读性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |