c++ - 在模板函数返回类型上使用 std::enable_if 来利用 SFINAE - 编译错误

标签 c++ templates sfinae

以下代码

#include <type_traits>

struct CByteArray {};
struct HLVariant {
    HLVariant() {}
    HLVariant(const HLVariant&) {}
    HLVariant(const CByteArray&) {}

    };

template <typename T>
inline typename std::enable_if<!std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
    return serialize(HLVariant(value));
}

template <typename T>
inline typename std::enable_if<std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
    return CByteArray();
}

template <>
inline CByteArray serialize(const HLVariant& value)
{
    return CByteArray();
}

int main()
{
    serialize(0);
    serialize(CByteArray());
    serialize(HLVariant());

    return 0;
}

触发编译错误 C2794: 'type' : is not a member of any direct or indirect base class of 'std::enable_if<false,CByteArray>'在 MSVC 2013 中。但是,它确实可以在 ideone 中工作:enter link description here

这里有什么错误吗?

该错误在 MSVC 2010、2012 和 2013 中是相同的。

最佳答案

对我来说看起来没问题,但我可以通过删除 template<> 来修复它来自serialize的最终过载。当正常的重载就可以的时候,不需要让它成为一个完整的特化!

编辑:其他有效的方法是提供仅匹配 HLVariant 的模板特化(并进一步限制其他特化不再匹配 HLVariant ,以避免歧义)。

这应该可以做到:

http://ideone.com/0UGkcn

#include <type_traits>
#include <iostream>

struct CByteArray {};
struct NonPod {public: int a; private: int b;};
struct HLVariant {
    HLVariant() {}
    HLVariant(const HLVariant&) {}
    HLVariant(const CByteArray&) {}
    HLVariant(const NonPod&) {}
};

template <typename T>
inline typename std::enable_if<std::is_same<T, HLVariant>::value && !std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
    std::cout << "serialize non-pod variant\n";
    return CByteArray();
}

template <typename T>
inline typename std::enable_if<!std::is_same<T, HLVariant>::value && !std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
    std::cout << "serialize non-pod non-variant\n";
    return serialize(HLVariant(value));
}

template <typename T>
inline typename std::enable_if<std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
    std::cout << "serialize pod\n";
    return CByteArray();
}

int main()
{
    std::cout << "int:\n";
    serialize(0);
    std::cout << "CByteArray:\n";
    serialize(CByteArray());
    std::cout << "HLVariant:\n";
    serialize(HLVariant());
    std::cout << "NonPod:\n";
    serialize(NonPod());
}

关于c++ - 在模板函数返回类型上使用 std::enable_if 来利用 SFINAE - 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26716609/

相关文章:

c++ - 抛出未处理的异常 : write access violation. bunnies_array 是 0x5CB3CBA

c++ - 在 C++11 中使用模板元编程连接列表

c++ - 如何使用SFINAE停用 `Pow(T)`的非集成版本?

c++ - OpenCV 中是否有用于 Delaunay 三角剖分的 C++ API?

python - 多维数组索引C++中的多维数组

c++ - 如何检查类型是智能指针还是对智能指针的引用

c++ - 与模板类中的友元函数链接错误

c++ - 如何从结构中提取最高索引的特化?

c++ - 类外的类函数模板定义

c++ - 用于在 C/C++ 中实现二维数组的数据局部性