Следующий код
#include <type_traits>
struct CByteArray {};
struct HLVariant {
HLVariant() {}
HLVariant(const HLVariant&) {}
HLVariant(const CByteArray&) {}
};
template <typename T>
inline typename std::enable_if<!std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
return serialize(HLVariant(value));
}
template <typename T>
inline typename std::enable_if<std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
return CByteArray();
}
template <>
inline CByteArray serialize(const HLVariant& value)
{
return CByteArray();
}
int main()
{
serialize(0);
serialize(CByteArray());
serialize(HLVariant());
return 0;
}
вызывает ошибку компиляции C2794: 'type' : is not a member of any direct or indirect base class of 'std::enable_if<false,CByteArray>'
в MSVC 2013. Однако это работает в ideone: введите здесь описание ссылки
В чем здесь ошибка?
Ошибка одинакова в MSVC 2010, 2012 и 2013.
serialize
, что упростит определение того, что происходит не так. Если вы удалитеserialize
, на котором нет ошибки, будет ли она по-прежнему генерировать ошибку? Если это так, отредактируйте свой пост с более простым кодом. - person Yakk - Adam Nevraumont   schedule 03.11.2014template<>
, что может быть побочным эффектом того, как MSVC выполняет полную специализацию. Какая строка является строкой 27? - person Yakk - Adam Nevraumont   schedule 03.11.2014template <> CByteArray serialize(const HLVariant& value)
. Что бы это ни значило. - person Violet Giraffe   schedule 03.11.2014serialize
, ошибка останется. - person Violet Giraffe   schedule 03.11.2014<> serialize (const int&)
, он затем пытается подставитьint
в обе базовые версии шаблона, а поскольку одна из них всегда скрыта, компиляция 1 из bae-функций всегда будет завершаться ошибкой независимо от типа после того, как компилятор встречаетenable_if<false, T>
. Ошибка компилятора? - person Violet Giraffe   schedule 03.11.2014serialize
в шаблон класса и специализировать этот шаблон? Как насчет специализации шаблонного метода класса, не являющегося шаблоном? - person Violet Giraffe   schedule 03.11.2014