模仿Barton和Nackman特技问题

时间:2009-06-05 05:39:15

标签: c++ templates g++ mcmc

我正在尝试使用Barton和Nackman技巧来实现类,以避免动态调度。 (我正在编写性能很重要的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>(来自Barton和Nackman的伎俩)。使用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 个答案:

答案 0 :(得分:7)

GibbsStep是一个模板类,需要在public Step<GibbsStep>中使用时进行实例化。您应该将其更改为public Step<GibbsStep<DerivedParameterType> >

答案 1 :(得分:1)

Naveen是对的,但你在这里展示的并不是Barton-Nackman的伎俩。这是CRTP(奇怪的重复模板模式)。你可以在这里阅读:

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

Burton-Nackman技巧处理受限制的模板扩展,并被模板特化语义所取代。你可以在这里阅读更多相关信息:

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

有亲切的问候, Ovanes