Природа ошибки отличается от упомянутой в эта тема.
Я пытаюсь реализовать способ 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 строки:
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 ++ исправит эти проблемы.
Других решений пока нет …