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, но не повезло. Есть ли какое-то исправление или лучше обойти эту проблему?

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 ++.
Это всегда приводит к истине. 🙁
старый добрый g ++ работает здесь тоже хорошо.

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]