我正在编写一个仅与std :: is_arithmetic模板适用的类型一起使用的类。我的代码如下:
#include <type_traits>
template<typename A, typename B>
class Stream {};
template <typename T>
class Stream <typename T,
typename std::enable_if<std::is_arithmetic<T>::value>::type * = nullptr> {
//...
};
编译器告诉我'='是语法错误,因为它期望的是'>',这没有多大意义。我觉得我还没有完全掌握部分模板的专业知识,我还缺少什么?
答案 0 :(得分:3)
在专业化中,紧随类名的模板参数列表必须仅包含类型和值。
您不能在其中放置默认参数,它们属于主模板。
而且您在那里不需要typename
(除非您有从属类型,例如typename std::enable_if<...T...>
)。
这是您代码的有效版本:
template<typename A, typename = void>
class Stream {};
template <typename T>
class Stream<T, std::enable_if_t<std::is_arithmetic_v<T>>>
{};
请注意,可以通过将非void
类型传递给第二个参数来规避检查。您可能应该在主模板中添加static_assert(std::is_void_v<T>);
,以防止意外使用。