4

動的ディスパッチを回避するために、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>置き換えると、すべてが正常にコンパイルされます。DerivedParameterTypedouble

何か案は?

4

2 に答える 2

7

GibbsStep はテンプレート クラスであり、使用中にインスタンス化が必要ですpublic Step<GibbsStep>。に変更する必要がありますpublic Step<GibbsStep<DerivedParameterType> >

于 2009-06-05T05:45:28.643 に答える
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

于 2009-06-05T11:00:30.680 に答える