我有以下代码,我希望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意味着专业化失败不是错误,那么为什么编译器会抱怨失败呢?
答案 0 :(得分:3)
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可以跳入以影响调用的过载集。