当前位置: 首页 > 知识库问答 >
问题:

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

闻人花蜂
2023-03-14

考虑代码:

#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

错误C2783:“CByteArray serialize(const std::enable_if::type

错误表明没有模板

我也尝试过这种方法enable_ifon return type而不是argument):

    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>'

共有1个答案

鲁景山
2023-03-14

typename std::启用

您可以使用:

template <typename T>
inline
typename std::enable_if</*your condition depending of T*/, CByteArray>::type
serialize(const T& value)
{
    // Your code
}

 类似资料:
  • 我正在尝试为自定义模板类创建一个加法运算符,其中第一个参数可以是我的类的实例,也可以是基本的数字类型。My operator的定义类似于下面的示例代码: 我的预期是,由于SFINAE,试图用

  • 关于enable_if和模板专门化的适当使用,我遇到了一个问题。 修改示例后(出于保密原因),下面是一个可比的示例: 我有一个名为“less”的函数,它检查第一个arg是否小于第二个arg。假设我想根据输入的类型有两种不同的实现——1种实现用于integer,另一种实现用于double。 我目前掌握的密码是这样的 上面的代码不编译,因为——它说我正在重新定义更少的方法。 错误是: 有人能指出这里的

  • 我正在尝试创建一个基本的应用程序,它是建模“粘滞便笺”活动。这将包含添加注释和删除注释的函数。下面是代码。在deleteNote函数中,我正在使用std::find方法在Notes的向量中查找标题,该向量是作为输入参数给出的。std::find API抛出编译错误。下面是代码。 下面是错误。 文件中包含的文件为/usr/include/c++/5/bits/stl_algoBase.h:71:0,

  • ii)当我更改代码并删除void_t时 0和0打印。表示,专门化是,所以我们使用基本模板。对于字符串,专门化无论如何都失败了。 我的问题:iii)有趣的部分。如果现在我把第一行改为使用int作为默认类型 有人能给我解释一下在iii)发生了什么吗?

  • 考虑以下头文件和源文件: 我在

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案