enable_if on类模板的成员模板函数

时间:2011-12-16 17:55:51

标签: c++ visual-studio templates typetraits enable-if

这接缝是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>();
}

1 个答案:

答案 0 :(得分:1)

这似乎是MSVC2010的一些奇怪行为,它无法确定您是否使用&lt; 1&gt;。作为模板参数是基于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
    ]

如果你将1的值换成0,你会发现它仍然不起作用,但是如果你使用任何其他有效的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是不明确的。希望这里的解决方法有助于通过谷歌绊倒这个... ...