为什么这在 VS 2010 中不起作用
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>();
}
结论:即使是模板的成员也必须强制模板化成员函数才能在 MSVC 2010 中执行 SFINAE。