2009-06-05 5 views
4

Ich versuche, Klasse mit dem Barton und Nackman Trick zu implementieren, um dynamischen Versand zu vermeiden. (Ich schreibe MCMC-Code, wo Leistung wichtig ist.) Ich bin kein C++ - Experte, aber der grundlegende Trick funktioniert für mich woanders. Allerdings habe ich jetzt einen Fall, in dem die zweite abgeleitete Klasse templatiert werden muss. Dies scheint Probleme zu verursachen. Der Umriss meines Codes ist:Templeted Barton und Nackman Trick Probleme

// Generic step class 
template<class DerivedStepType> 
class Step { 
public: 
    DerivedStepType& as_derived() { 
    return static_cast<DerivedStepType&>(*this); 
    } 

    void DoStep() { 
    return as_derived.DoStep(); 
    } 
}; 

// Gibbs step 
template<class DerivedParameterType> // THIS IS THE PROBLEM 
class GibbsStep : public Step<GibbsStep> { 
public: 
    GibbsStep(DerivedParameterType new_parameter) { 
    } 
    void DoStep() { 
    } 
}; 

Das Problem ist template<class DerivedParameterType> und die folgende <GibbsStep> (aus dem Barton und Nackman Trick). Mit g ++ v 4,01 (OSX), erhalte ich folgende Fehlermeldung:

./src/mcmc.h:247: error: type/value mismatch at argument 1 
in template parameter list for 'template<class DerivedStepType> class Step' 
./src/mcmc.h:247: error: expected a type, got 'GibbsStep' 

Alles kompiliert in Ordnung, wenn ein Tropfen template<class DerivedParameterType> und ersetzen DerivedParameterType mit, sagen wir, double.

Irgendwelche Ideen?

Antwort

7

GibbsStep ist eine Vorlagenklasse und erfordert Instanziierung, während Sie in public Step<GibbsStep> verwenden. Sie sollten es zu public Step<GibbsStep<DerivedParameterType> >

+0

kleine Korrektur: GibbsStep ist eine Klasse-Template und keine Template-Klasse;) – ovanes

1

Naveen ist richtig, aber was Sie hier zeigen, ist kein Barton-Nackman-Trick. Dies ist CRTP (seltsam wiederkehrende Vorlage Muster). Sie können hier darüber lesen:

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Curiously_Recurring_Template_Pattern

Burton-Nackman Trick beschäftigt sich mit eingeschränkten Vorlage Expansion und wurde von Template-Spezialisierung Semantik abgelöst. Hier können Sie mehr darüber lesen:

http://en.wikipedia.org/wiki/Barton-Nackman_trick

Mit freundlichen Grüßen, Ovanes

+0

re „... durch Template-Spezialisierung abgelöst Semantik "- nicht vollständig. Es gibt noch einige Anwendungen, wie zum Beispiel im Wikipedia-Artikel gezeigt. Concept Maps in C++ 0x werden diese Verwendung des Barton-Nackmann-Tricks ersetzen. –

+0

Ja, ich weiß, ich wollte den Beitrag nicht zu kompliziert machen. – ovanes

Verwandte Themen