2

错误的性质与此线程中提到的不同。
我正在尝试在 VC++ 环境中实现一种 SFINAE 方式,该方式查找一个类是否包含成员(方法)。

下面是一个简化的代码:

template<typename Class>
class HasMember_Method
{
  typedef char (&yes)[2];

  template<unsigned int> struct Exists;

  template<typename V>
  static yes CheckMember (Exists<sizeof(&V::Method)>*);  // <--- VC++ problem
  template<typename>
  static char CheckMember (...);

public: 
  static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes));
};

Method是我们正在寻找的成员方法。即使没有 C++11 ,这段代码在g++ 环境中也能正常工作。
然而,同样会导致错误的 VC++ 编译器错误:

错误 C2070:“重载函数”:非法 sizeof 操作数

我尝试了使用 SFINAE 的其他解决方法decltype,但没有运气。是否存在针对此问题的任何修复或更好的解决方法?

4

1 回答 1

2

虽然下面不是正确的答案,但它至少解决了这个问题。在代码片段中,我更改了 2 行:

template<typename Class>
class HasMember_Method
{
  typedef char (&yes)[2];

  template<typename> struct Exists; // <--- changed

  template<typename V>
  static yes CheckMember (Exists<decltype(&V::Method)>*); // <--- changed (c++11)
  template<typename>
  static char CheckMember (...);

public: 
  static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes));
};

这修复了 VS2010/12 中的编译问题!

等待!这揭示了错误的 VC++ 编译器中的另一个缺陷。
它总是导致 true。:(好的旧 g++ 在这里也可以
正常工作。

所以正确的答案是等待微软VC++编译器团队修复这些问题。

于 2014-01-07T14:41:38.100 回答