考虑代码:
#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序列化(const HLVariant&amp;)'不是函数模板的特化
错误C2783:'CByteArray序列化(const std :: enable_if :: type &amp;)':无法推断'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>'
答案 0 :(得分:2)
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
}