2

为什么这在 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。

4

1 回答 1

3

作为一个不完全确定 SFINAE 的许多细节的人,我敢说问题是你的函数没有模板化——因此即使它们被证明是非法的,编译器也不允许丢弃它们。

尝试

template<typename T = Titem>
typename std::enable_if<std::has_trivial_destructor<T>::value, BOOL>::type
Clear()
{
    ...
}

template<typename T = Titem>
typename std::enable_if<!std::has_trivial_destructor<T>::value, BOOL>::type
Clear()
{
    ...
}

已编辑:Titem根据 Matthieu M. 的建议添加为默认参数。

于 2012-12-18T08:12:29.527 回答