Шаблонные проблемы с Бартоном и Нэкманом - PullRequest
4 голосов
/ 05 июня 2009

Я пытаюсь реализовать класс, используя трюк Бартона и Нэкмана, чтобы избежать динамической отправки. (Я пишу код 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.

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 05 июня 2009

GibbsStep является классом шаблона и требует создания экземпляров при использовании в public Step<GibbsStep>. Вы должны изменить его на public Step<GibbsStep<DerivedParameterType> >

1 голос
/ 05 июня 2009

Навин прав, но то, что вы показываете здесь, не трюк Бартона-Накмана. Это CRTP (Любопытно повторяющийся шаблон). Вы можете прочитать об этом здесь:

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

Уловка Бертона-Нэкмана связана с ограниченным расширением шаблона и была заменена семантикой специализации шаблона. Подробнее об этом можно прочитать здесь:

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

С наилучшими пожеланиями, Ованес

...