Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 铸造操作工用SFINAE_C++_Gcc_Sfinae_Enable If_Typecast Operator - Fatal编程技术网

C++ 铸造操作工用SFINAE

C++ 铸造操作工用SFINAE,c++,gcc,sfinae,enable-if,typecast-operator,C++,Gcc,Sfinae,Enable If,Typecast Operator,我有一个类,它包装一个枚举并为它提供字符串转换。现在,我引入了模板参数“fastStringConvert”,它控制如何使用SFINAE进行转换(可在此处找到:)。代码在MSVC下编译,但在GCC和Clang下失败 error: no type named ‘type’ in ‘struct std::enable_if<false, void>’ 错误:“struct std::enable_if”中没有名为“type”的类型 有什么问题?我应该如何更改代码 以下或此处代码的相

我有一个类,它包装一个枚举并为它提供字符串转换。现在,我引入了模板参数“fastStringConvert”,它控制如何使用SFINAE进行转换(可在此处找到:)。代码在MSVC下编译,但在GCC和Clang下失败

error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
错误:“struct std::enable_if”中没有名为“type”的类型
有什么问题?我应该如何更改代码

以下或此处代码的相关部分:

#包括
#包括
#包括
模板<
类子类,
typename枚举类型,
bool fastStringConvert=true
>
类智能数
{
公众:
模板<
typename sfinaepostoner=EnumType,
typename=typename std::enable_if::type
>
显式运算符常量std::string&()常量
{
自动名称=子类::名称().find((int)值);
if(name!=子类::names().end())
{
返回名称->秒;
}
其他的
{
静态常量标准::字符串na(“不适用”);
返回na;
}
}
模板<
typename sfinaepostoner=EnumType,
typename=typename std::enable_if::type
>
显式运算符const std::string()const
{
自动名称=子类::名称().find((int)值);
if(name!=SubClass::names().end())返回name->second;
否则返回std::to_字符串((int)值);
}
受保护的:
typedef const std::映射名称;
枚举类型值;
};
枚举类Foo_类型:int{a,b,c};
struct Foo:SmartEnum
{ 
typedef-num基;
静态常量Base::Names&Names()
{ 
静态常量Base::Names Names={{0,“a”},{1,“b”},{2,“c”};
返回姓名;
} 
};

必须使用方法中的模板参数,否则会出现硬错误,例如:

template <
    typename SFINAEPostponer = EnumType,
    bool Cond = !fastStringConvert,
    typename = typename std::enable_if<Cond, void>::type
>
explicit operator const std::string() const

谢谢,这很有帮助。我甚至不需要这样的第一个参数。你能解释一下这两种解决方案的区别吗?@simon你不能只根据模板参数的默认值来重载函数,就像不能基于其参数的默认值重载函数一样,我最近观看了Stephan t.Lavavej的视频,他建议使用
typename std::enable_if::type=nullptr
,因为没有任何东西可以隐式转换为
void**
template <
    typename SFINAEPostponer = EnumType,
    bool Cond = !fastStringConvert,
    typename = typename std::enable_if<Cond, void>::type
>
explicit operator const std::string() const
template <
    typename SFINAEPostponer = EnumType,
    bool Cond = !fastStringConvert,
    typename std::enable_if<Cond, void>::type* = nullptr
>
explicit operator const std::string() const