2011-12-16 11 views
3

このシームはMSVC10のバグですか?enable_if on memberテンプレートのテンプレートテンプレートの機能

#include <type_traits> 

template<int j> 
struct A{ 
    template<int i> 
    typename std::enable_if<i==j>::type 
     t(){} 
}; 

int main(){ 
    A<1>().t<1>(); //error C2770 
} 

エラーC2770:無効な明示的なtemplate_or_generic引数(複数可)、 "enable_if ::タイプA ::トン(無効)"。

次のコンパイル:

#include <type_traits> 

template<class j> 
struct A{ 
    template<class i> 
    typename std::enable_if<std::is_same<i,j>::value>::type 
     t(){} 
}; 

template<unsigned int j> 
struct B{ 
    template<unsigned int i> 
    typename std::enable_if<i==j>::type 
     t(){} 
}; 

int main(){ 
    A<int>().t<int>(); 
    B<1>().t<1>(); 
} 
+1

g ++とclang ++で動作します。 '#include 'と 'std :: enable_if'を使っていますか? – kennytm

+0

はい.......... 12 –

+1

エラーとは何ですか?投稿していない "働いていない"。 「働いていない」とはどういう意味ですか?コンパイルされていないのですか? – Nawaz

答えて

1

< 1のかどうか、あなたの使用について決意を作ることができないMSVC2010の一部にいくつかの奇妙な行動のように見える>テンプレートパラメータとしてありますintベースのテンプレートのインスタンス化。

私は上記のコードをコンパイルすると、私は次の、詳細なエラーが出る:

error C2770: invalid explicit template argument(s) for 
    'std::enable_if<i==1>::type A<j>::t(void)' 
    with 
    [ 
     j=1 
    ] 
    d:\programming\stackoverflow\stackoverflow\stackoverflow.cpp(11) : 
    see declaration of 'A<j>::t' 
    with 
    [ 
     j=1 
    ] 

あなたが0のためのあなたの1つの値を交換した場合、あなたはそれはまだ動作しません見つけることが、あなたはいずれかを使用している場合他の有効なint、テンプレートは非常に楽しくコンパイルするようです。

私はなぜこれが起こっている全くわからないんだけど、あなたはテンプレートパラメータを表現するためのconst int型を使用してこのコードの動作を行うことができます。

template<int j> 
    struct A{ 
     template<int i> 
     typename std::enable_if<i == j>::type 
      t(){} 
    }; 

    int main(){ 

     const int j = 1; 
     const int i = 1; 

     A<j>().t<i>(); //now compiles fine 
    } 

私の疑い、これに基づいて、ということはコンパイラですテンプレートのインスタンス化に関して0と1の使用があいまいであることがわかります。うまくいけば、ここの回避策は、Googleを介してこれを横たわる誰かに役立ちます...

関連する問題