動的ディスパッチを回避するために、BartonandNackmanトリックを使用してクラスを実装しようとしています。(私はパフォーマンスが重要なMCMCコードを書いています。)私はC ++の専門家ではありませんが、基本的なトリックは他の場所で機能しています。ただし、2番目の派生クラスをテンプレート化する必要がある場合があります。これは問題を引き起こすようです。私のコードの概要は次のとおりです。
// 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
何か案は?