从类型到相同类型的"Conversion"导致错误
"Conversion" from type to same type is causing error
我有一个模板函数,其中枚举类型转换为其底层类型,工作良好,但我写了一个重载,它应该接受一个整数并返回它自己,它给我一个错误,int不是枚举类型。在我的模板中,这应该被过滤掉。怎么了?
模板代码如下:
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<!std::is_enum<TT>::value, TT>::type
{
return t;
}
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<std::is_enum<TT>::value, typename std::underlying_type<TT>::type>::type
{
return (typename std::underlying_type<TT>::type)t;
}
std::underlying_type<TT>::type
在std::enable_if
中被评估,即使std::is_enum<TT>::value
是false
,因为false
不是错误。由于正在计算非枚举类型,因此会导致错误。如果我们将SFINAE移动到模板参数中,我们可以得到所需的重载,并且仍然返回正确的类型。
template <typename TT, typename std::enable_if<!std::is_enum<TT>::value, TT>::type* = nullptr>
static constexpr auto get_value(TT t) -> TT
{
return t;
}
template <typename TT, typename std::enable_if<std::is_enum<TT>::value>::type* = nullptr>
static constexpr auto get_value(TT t) -> typename std::underlying_type<TT>::type
{
return (typename std::underlying_type<TT>::type)t;
}
你可以看到它在这个实例
试图用非枚举类型的T
实例化std::underlying_type<T>
,您违反了标准对模板参数T
的要求:
§20.10.7.6 [meta.trans.]其他)/表57:
Template | Condition | Comments
------------------------+---------------------------+-----------------------
template <class T> | T shall be an enumeration | The member typedef
struct underlying_type; | type (7.2) | type shall name
| | the underlying type
| | of T.
如果不喜欢任何额外的模板参数,这里有一个替代方法:
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<!std::is_enum<TT>::value, TT>::type
{
return t;
}
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<std::is_enum<TT>::value
, std::underlying_type<TT>
>::type::type
{
return (typename std::underlying_type<TT>::type)t;
}
这样,std::underlying_type<TT>
的实例化被延迟,直到std::enable_if
中的条件求值为true
,因为std::enable_if<B,T>::type
返回的值需要一个嵌套的type
定义。
相关文章:
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 如何'Invalid conversion'和'no match for operator'更正这些 c++ 错误
- 访问函数变体时"Invalid conversion"错误
- 为什么我会收到"invalid conversion from 'Queue*/Stack*' to 'int'"错误消息?
- 函数模板不起作用,出现错误"No suitable user-defined conversion"
- 尝试将类作为参数传递给不同的类构造函数,但收到"conversion"错误
- 使用strupr和strlwr时如何解决错误"invalid conversion of char to char*"?
- 如何解决"expected constructor, destructor, or type conversion before ‘(’ token"错误?
- 我收到一个" conversion from ‘std::string (*)[50]’ to non-scalar type ‘std::string’ requested"错误,似乎无法修复它
- Typo:bool to int conversion诱导的std :: ifstream在Linux下的错误
- C++继承"No Viable Conversion"错误
- 获取线中的"Invalid conversion"错误
- 找不到错误"invalid conversion from char to const char*"的解决方案
- C++ sendto() 给出"invalid conversion from ‘int (*)(int, int, int)throw ()’ to ‘int’"错误
- C++收到"invalid user-defined conversion"错误
- 多态性>错误:'no known conversion from derived class to base class'
- 专用转换函数导致"ambiguous default type conversion"错误 (c++)
- 将字符串传递给函数时出现"conversion to const char*"错误
- 错误的“-wsign-conversion”错误与“ntohs(..)'在手臂上
- 错误消息"invalid conversion from ‘void*’ to ‘unsigned int’"