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++ исправит эти проблемы.