2016-08-31 2 views
1

bitte helfen Sie mir bei folgendem Problem:CRTP: Rufen Sie abgeleitete Klasse Templat-Methode von der Basis

Ich habe eine Klasse deklariert als:

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)); 
    } 
}; 

, die von Design::GenericComponent<> mit CRTP erbt. Innerhalb Design :: GenericComponent <> gibt es eine Methode:

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>()); 
    } 
}; 

Die get() Methode von GenericComponent sollte die DummyEquation() Templat-Methode aus der abgeleiteten Rim<GEAR_TYPE> Klasse aufrufen. Aber die Art, wie es wie aufgeführt implementiert wird, funktioniert nicht - Compiler meldet Probleme mit der Konstanz dieses Zeigers beim Versuch, in abgeleitete Klasse zu werfen ...

Wie bekomme ich das? Ich habe fast alle möglichen Const Qualifier-Platzierungen ausprobiert, aber nichts hat mein Problem gelöst. Nur noch eine Sache zu nennen - die Methode create<>() nicht als const qualifiziert werden kann (create<>() const), wie es der Inhalt es ist Eigentümer Klasse modifiziert ...

Vielen Dank im Voraus für jeden bereit, mir zu helfen ... Prost Martin

+0

DummyEquation muss eine konstante Methode sein, wenn Sie es durch einen Const-Zeiger aufrufen möchten. –

Antwort

1

this ist ein Zeiger auf ein const Objekt (im Bereich get). Wenn Sie die Vererbungshierarchie nach unten verschieben, ändert sich die const -ness des resultierenden Objekts nicht.

Also entweder DummyEquation & create Notwendigkeit const Mitgliederfunktionen oder get Bedürfnisse sein const nicht sein.

+0

Also verstehe ich es richtig, das const am Ende der Methodendeklaration spezifiziert die Konstanz von 'this' im Rahmen der Methode selbst? –

+0

@ MartinKopecký, Sie verstehen wirklich richtig. – StoryTeller

Verwandte Themen