3

これは MSVC10 のバグでしょうか?

#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::type A::t(void)" が無効です。

以下がコンパイルされます。

#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>();
}
4

1 に答える 1

1

これは、テンプレートパラメータとしての<1>の使用がintベースのテンプレートのインスタンス化であるかどうかを判断できない、MSVC2010の一部の奇妙な動作のようです。

上記のコードをコンパイルすると、次の詳細なエラーが発生します。

    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
    ]

1の値を0に交換しても、それでも機能しないことがわかりますが、他の有効なintを使用すると、テンプレートは非常に正常にコンパイルされているように見えます。

なぜこれが発生するのか完全にはわかりませんが、const intsを使用してテンプレートパラメータを表すことにより、このコードを機能させることができます。

    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の使用をあいまいに見つけているということです。うまくいけば、ここでの回避策は、グーグルを通してこれに遭遇した誰かに役立つでしょう...

于 2012-11-20T16:28:25.020 に答える