C++ 尝试使用SFINAE(std::enable_if)和模板专门化时出现编译错误

C++ 尝试使用SFINAE(std::enable_if)和模板专门化时出现编译错误,c++,templates,sfinae,C++,Templates,Sfinae,以代码为例: #include <type_traits> struct CByteArray {}; struct HLVariant { HLVariant() {} HLVariant(const HLVariant&) {} HLVariant(const CByteArray&) {} }; template <typename T> inline CByteArray serialize(const typ

以代码为例:

#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;
}
现在的错误是:

C2039: 'type' : is not a member of 'std::enable_if<false,CByteArray>'
C2039:'type':不是'std::enable_if'的成员

typename std::enable\u如果::type
在您的上下文中不可扣除(如果编译器测试
T
,在一般情况下可能是无限类型)

您可以改为使用:

template <typename T>
inline
typename std::enable_if</*your condition depending of T*/, CByteArray>::type
serialize(const T& value)
{
    // Your code
}
模板
内联
typename std::enable_if::type
序列化(常量T和值)
{
//你的代码
}

我认为如果你用结构化的专业化方法来做,它会起作用。。。(处理它)对于SFINAE,条件应取决于模板参数。
模板内联CByteArray serialize(const HLVariant&value)
由于您没有显式指定模板参数,编译器必须(从函数参数类型)推断它们。但这是不可能的,因为对于这两个
序列化
模板,
T
都处于非推断上下文中。
std::enable\u if::type
由于没有依赖于模板参数的类型,因此此处不会发生替换,因此在替换过程中不会发生错误(=>硬错误,无SFINAE).
true
/
false
不依赖于
t
,因此您有一个硬错误,而不是替换失败。我明白了!快到了,但还不完全到。现在它使用ideone编译,但MSVC仍然给出一个错误
“type”:它不是“std::enable_if”
的任何直接或间接基类的成员。有关代码,请参见此处:
template <typename T>
inline
typename std::enable_if</*your condition depending of T*/, CByteArray>::type
serialize(const T& value)
{
    // Your code
}