繁体   English   中英

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

[英]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&); 函数对编译器可见,我不明白为什么。 请注意,在这里我只是将truefalse用于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM