我正在尝试使用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
.
有任何想法吗?
GibbsStep是一个模板类,在您使用时需要实例化public Step<GibbsStep>
.你应该把它改成public Step<GibbsStep<DerivedParameterType> >