CRTP:从基础

时间:2016-08-31 09:58:09

标签: c++ templates crtp

请帮我解决以下问题:

我有一个声明为:

的类
template<typename GEAR_TYPE>
class Rim
    :   /* Derive from GenericComponent Design perspective using CRTP */
        public Design::GenericComponent<Rim<GEAR_TYPE>>
{
public:
    template<typename IDENTIFICATION_TAG>
    typename Base::Parameter<typename IDENTIFICATION_TAG::UnitType, typename IDENTIFICATION_TAG::DataType>::QuantityType & DummyEquation( void )
    {
        return( Base::Parameter<typename IDENTIFICATION_TAG::UnitType, typename IDENTIFICATION_TAG::DataType>::QuantityType::from_value( 222 ) );
    }
};

使用CRTP从Design::GenericComponent<>继承。在Design :: GenericComponent&lt;&gt;中有一种方法:

template<typename DERIVED_COMPONENT_TYPE>
class GenericComponent
{
public:
    template<typename PARAM_IDENTIFICATION>
    std::shared_ptr<Base::Parameter<typename PARAM_IDENTIFICATION::UnitType, typename PARAM_IDENTIFICATION::DataType>> get( void ) const
    {
        mParameters.template create<PARAM_IDENTIFICATION>( static_cast<const DERIVED_COMPONENT_TYPE *>( (this) )->template DummyEquation<PARAM_IDENTIFICATION>() );
    }
};

来自get()的{​​{1}}方法应该从派生的GenericComponent类调用DummyEquation()模板化方法。但是它列出的实现方式不起作用 - 编译器在尝试转换为派生类时会报告此指针的常量问题......

如何让这个工作?我已经尝试了几乎所有可能的const限定符位置,但没有解决我的问题。还有一件事需要提及 - 方法Rim<GEAR_TYPE>无法限定为create<>()const),因为它会修改其所有者类的内容......

非常感谢愿意帮助我的人...干杯马丁

1 个答案:

答案 0 :(得分:1)

this是指向const对象的指针(在get范围内)。将其转换为继承层次结构并不会更改结果对象的const - 。

所以DummyEquation&amp; create必须是const个成员函数,或get必须是非const