考虑代码:
#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_if
on 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>'
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)发生了什么吗?
考虑以下头文件和源文件: 我在
还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案