类模板专业化中“期望'>'”?

时间:2019-11-26 21:30:54

标签: c++ templates template-specialization

我正在编写一个仅与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> {
    //...
};

编译器告诉我'='是语法错误,因为它期望的是'>',这没有多大意义。我觉得我还没有完全掌握部分模板的专业知识,我还缺少什么?

1 个答案:

答案 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>);,以防止意外使用。