模仿Barton和Nackman特技问题

4 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() {
  }
};
Run Code Online (Sandbox Code Playgroud)

问题是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'
Run Code Online (Sandbox Code Playgroud)

如果丢弃template<class DerivedParameterType>,一切都可以很好地编译DerivedParameterType,例如,替换double.

有任何想法吗?

Nav*_*een 7

GibbsStep是一个模板类,在您使用时需要实例化public Step<GibbsStep>.你应该把它改成public Step<GibbsStep<DerivedParameterType> >