Ich versuche, eine Klasse zu implementieren, die den Barton- und Nackman-Trick verwendet, um dynamisches Dispatch zu vermeiden. (Ich schreibe MCMC-Code, bei dem es auf die Leistung ankommt.) Ich bin kein C++-Experte, aber der grundlegende Trick funktioniert bei mir auch anderswo. Allerdings habe ich jetzt einen Fall, in dem die zweite abgeleitete Klasse als Vorlage verwendet werden muss. Das scheint Probleme zu verursachen. Die Grundzüge meines Codes sind:
// 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 folgenden <GibbsStep>
(aus dem Trick von Barton und Nackman). Mit g++ v 4.01 (OSX), erhalte ich den folgenden Fehler:
./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 lässt sich gut kompilieren, wenn ein Tropfen template<class DerivedParameterType>
und ersetzen DerivedParameterType
mit, sagen wir, double
.
Irgendwelche Ideen?