2009-06-05 11 views
4

ダイナミックディスパッチを避けるために、バートンとナックマンのトリックを使ってクラスを実装しようとしています。私は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>と(バートンとNackmanトリックから)以下<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>場合は罰金コンパイルしdouble、たとえば、とDerivedParameterTypeを交換してください。

アイデア?

答えて

7

GibbsStepはテンプレートクラスであり、public Step<GibbsStep>で使用している間にインスタンス化が必要です。あなたはそれをpublic Step<GibbsStep<DerivedParameterType> >に変更する必要があります。

+0

小さな修正:GibbsStepはクラステンプレートではなく、テンプレートクラスです;) – ovanes

1

Naveenは正しいですが、ここに示した内容はBarton-Nackmanのトリックではありません。これはCRTP(Curiously Recurring Template Pattern)です。制限されたテンプレート展開と

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Curiously_Recurring_Template_Pattern

バートン-Nackmanトリックのお得な情報をとテンプレートの特殊セマンティクスに取って代わられました:あなたはここでそれについて読むことができます。あなたはここでそれについての詳細を読むことができます:

種類に関して

http://en.wikipedia.org/wiki/Barton-Nackman_trick

、 Ovanes

+0

「再...テンプレートの特殊化に取って代わられました意味論 " - 完全ではない。たとえば、Wikipediaの記事に示されているように、まだいくつかの用途があります。 C++ 0xのコンセプトマップは、最終的にBarton-Nackmannのトリックのこの使用を置き換えます。 –

+0

はい、わかった、私は投稿を過度に複雑にしたくなかった。 – ovanes