2012-01-26 8 views
2

次のコードは、Visual Studio 2005上で動作しますが、G ++ 4.4.5でコンパイルしたとき、私のコンパイラエラーを与える:の選択タイプ:: IF_と整数テンプレートパラメータ

#include <boost/mpl/if.hpp> 
#include <boost/mpl/bool.hpp> 

template<int X> struct A 
{ 
    void f() { 
     typedef boost::mpl::if_<boost::mpl::bool_<X == 1>, int, bool>::type Type; 
    } 
}; 

これは私が取得エラーです:

main.cpp: In member function ‘void A<X>::f()’: 
main.cpp:12: error: too few template-parameter-lists 

コードにはどのような問題がありますか?テンプレート化されたXをハードコーディングされた数字に置き換えた場合、コードはちょうどいいです。私はまた、mpl :: int_型でXをラップしようとしましたが、成功しませんでした。

ありがとうございます!

+0

完全な例を掲載してください(http://sscce.orgで説明されています)? –

答えて

2

あなたはtypenameキーワードが必要です

typedef typename     // <-- Here 
    boost::mpl::if_< 
     boost::mpl::bool_<X == 1>, 
     int, 
     bool 
    >::type Type; 

コンパイラはXの価値を知らないためmpl::if_<...>::typeは、タイプであることを確認することができません:if_は、特定のパラメータに特化してtypeメンバーを含めることでした例えばタイプ、されていない。したがって

//Silly if_ specialization 
template <typename Then, typename Else> 
struct if_<void, Then, Else> 
{ 
    int type; 
}; 

、明示的::typeの種類を表し、コンパイラに指示する必要があり、 typenameキーワードを使用します。

ここでの詳細な説明はWhere and why do I have to put the template and typename keywordsです。

+0

ありがとうございます!それは私がそれを私に説明されたら、今、本当に意味をなさない... – user1169299

関連する問題