为什么在VS 2010中请帮助我了解为什么SFINAE没有在这种情况下工作
typename std::enable_if<!std::has_trivial_destructor<Titem>::value, BOOL>::type
Clear()
{
...
}
typename std::enable_if<std::has_trivial_destructor<Titem>::value, BOOL>::type
Clear()
{
...
}
不是这个工作,它是一个模板类中。
我得到以下错误:
error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
在SFINAE错误。显然,替代失败是一个错误。我知道它可能只是优化析构函数调用,所以这不是一个真正的现实场景。每次我想我终于明白了SFINAE,当我尝试使用它时,它仍然不起作用。
在回应一些评论(大约只有返回值超载关心),我把它改成了虚拟参数技术。
这工作:
template<typename U>
BOOL _Clear(typename std::enable_if<!std::has_trivial_destructor<U>::value>::type *dummy = 0)
{
...
}
template<typename U>
BOOL _Clear(typename std::enable_if<std::has_trivial_destructor<U>::value>::type *dummy = 0)
{
...
}
BOOL Clear()
{
return _Clear<Titem>();
}
结论:模板甚至成员必须强制模板成员函数做SFINAE在2010年MSVC
错误是出现什么线?另外,你是否仅仅基于返回类型重载'Clear()'?这是不可能的。 – iammilind
这不是真正的超载,因为只有一个是有效的。另一个有替代失败。编译器只能考虑一个。很显然,我的理解有些错误。 – doug65536
第一个清除定义有错误。我认为SFINAE会永远失败,没有:: type(如果你知道我的意思)。 – doug65536