C ++模板sfinae错误

时间:2015-03-20 16:23:15

标签: c++ templates boost sfinae

我有以下代码,我希望TestEnableIf具有不同的专业化,以具有不同的打印功能,但它没有按计划运行,错误如下。

struct myStruct;
struct notMyStruct;

template<typename T> struct TestEnableIf
{
        template<typename boost::enable_if< boost::is_same<myStruct, T>, int >::type = 0> void print()
        {
            std::cout << "this is my struct" << std::endl;
        }

        template<typename boost::enable_if< boost::is_same<notMyStruct, T>, int>::type=0> void print()
        {
            std::cout << "This is not my struct" << std::endl;
        }


};

static void testIsSame()
{

    TestEnableIf<myStruct> testEnable;
     testEnable.print();
     TestEnableIf<notMyStruct> testNotEnable;
     testNotEnable.print();
}
  

../ src / testBoostGeneric.h:39:90:错误:没有名为'type'的类型   'struct boost :: enable_if,int&gt;'   模板,   INT&GT; ::类型= 0&GT; void print()                                                                                             ^ ../src/testBoostGeneric.h:在'struct的实例化中   TestEnableIf':../ src / testBoostGeneric.h:53:29:
  从这里需要../src/testBoostGeneric.h:34:90:错误:没有类型   在'struct boost :: enable_if,int&gt;'template,int&gt; :: type = 0&gt;中命名为'type' void print()

我不明白的是,如果sfinae意味着专业化失败不是错误,那么为什么编译器会抱怨失败呢?

1 个答案:

答案 0 :(得分:3)

顺便说一句,对于成员函数,SFINAE(S是“替换”,而不是“特化”)对于类类型参数不起作用。解决这个问题的一种简单方法是使用另一个模板参数:

template<
    typename TCopy = T
    typename boost::enable_if< boost::is_same<myStruct, TCopy>, int >::type = 0
> void print()
{
    std::cout << "this is my struct" << std::endl;
}

我从STL's CppCon talk取出了这个。 TL; DW:当使用类的T类型参数时,编译器在实例化类模板时知道该类型是什么,并在那个时间点检查type成员。如果函数是本地的额外TCopy类型参数,则在实例化函数之前编译器无法确定,此时SFINAE可以跳入以影响调用的过载集。