尝试使用 SFINAE (std::enable_if) 和模板专业化时出现编译错误 [重复]

问题描述 投票:0回答:1

考虑代码:

#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 序列化(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>'
c++ templates sfinae
1个回答
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
}
© www.soinside.com 2019 - 2024. All rights reserved.