我正在尝试使用 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 ,那么一切都可以正常编译。

有任何想法吗?

最佳答案

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

关于c++ - 模板化的 Barton 和 Nackman 技巧问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/954398/

10-14 08:02