Я пытаюсь реализовать класс, используя трюк Бартона и Нэкмана, чтобы избежать динамической отправки. (Я пишу код MCMC, где важна производительность.) Я не эксперт по C ++, но основной трюк работает для меня в другом месте. Однако теперь у меня есть случай, когда второй производный класс должен быть шаблонным. Это, кажется, вызывает проблемы. Схема моего кода:
// 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() {
}
};
Проблема в template<class DerivedParameterType>
и следующем <GibbsStep>
(из трюка Бартона и Нэкмана). Используя g ++ v 4.01 (OSX), я получаю следующую ошибку:
./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'
Все компилируется нормально, если капля template<class DerivedParameterType>
и заменить DerivedParameterType
, скажем, double
.
Есть идеи?