VC++ SFINAE выдает ошибку C2070: "перегруженная функция": недопустимый размер операнда

Природа ошибки отличается от упомянутой в этой теме.
Я пытаюсь реализовать способ SFINAE в среде VC++, которая находит, содержит ли класс член (метод) или нет.

Ниже приведен упрощенный код для этого:

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 метод члена, который мы ищем. Этот код прекрасно работает в среде g ++ даже без C++11.
Однако то же самое приводит к ошибке компилятора для глючного VC++:

ошибка C2070: "перегруженная функция": недопустимый размер операнда

Я пробовал другой обходной путь для SFINAE, используя decltype, но не повезло. Есть ли какое-то исправление или лучше обойти эту проблему?

1 ответ

Решение

Хотя ниже приведен неправильный ответ, он, по крайней мере, устраняет проблему. Во фрагменте кода я изменил 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++.
Это всегда приводит к истине.:(
Старый добрый g ++ отлично работает и здесь.

Поэтому правильный ответ - дождаться, пока команда компиляторов Microsoft VC++ исправит эти проблемы.

Другие вопросы по тегам