[英]Compilation errors when attempting to use SFINAE (std::enable_if) and template specialization
考虑一下代码:
#include <type_traits>
struct CByteArray {};
struct HLVariant {
HLVariant() {}
HLVariant(const HLVariant&) {}
HLVariant(const CByteArray&) {}
};
template <typename T>
inline CByteArray serialize(const typename std::enable_if<true, T>::type& value)
{
return serialize(HLVariant(value));
}
template <typename T>
inline CByteArray serialize(const typename std::enable_if<false, T>::type& value)
{
return CByteArray();
}
template <>
inline CByteArray serialize(const HLVariant& value)
{
return CByteArray();
}
int main()
{
serialize(0);
serialize(CByteArray());
serialize(HLVariant());
return 0;
}
Microsoft Visual Studio 2013给出以下错误:
C2912:显式专门化'CByteArray serialize(const HLVariant&)'不是功能模板的专门化
错误C2783:'CByteArray serialize(const std :: enable_if :: type&)':无法推断出'T'的模板参数
该错误表明没有template <typename T> CByteArray serialize(const T&);
函数对编译器可见,我不明白为什么。 请注意,在这里我只是将true
和false
用于enable_if
条件用于测试目的。
我也尝试过这种方式(在返回类型而不是参数上启用enable_if
):
template <typename T>
inline typename std::enable_if<true, CByteArray>::type serialize(const T& value)
{
return serialize(HLVariant(value));
}
template <typename T>
inline typename std::enable_if<false, CByteArray>::type serialize(const T& value)
{
return CByteArray();
}
现在错误是:
C2039: 'type' : is not a member of 'std::enable_if<false,CByteArray>'
typename std::enable_if<true, T>::type
在您的上下文中是不可扣除的(编译器应测试该T
,对于一般情况它可能是无限类型)。
您可以改用:
template <typename T>
inline
typename std::enable_if</*your condition depending of T*/, CByteArray>::type
serialize(const T& value)
{
// Your code
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.