为什么不能在专用参数上使用enable_if?

时间:2016-05-25 02:36:33

标签: templates c++11

我正在尝试为整数类型创建部分特化。我的想法是做类似的事情:

#include <type_traits>

template <typename T>
struct Class {
};

template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};

然而,这会导致以下错误:

error: template parameters not deducible in partial specialization:
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
       ^
note: 'T'

如果我使用额外的模板参数,它确实有效:

#include <type_traits>

template <typename T, typename Enable = void>
struct Class {
};

template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};

为什么我需要额外的模板参数?

1 个答案:

答案 0 :(得分:3)

在第一种情况下,你并不专门研究这门课程。 当你写:

template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};

T仍然是通用模板类型,并且您的编译器会感到困惑。

在第二种情况下,当你写

template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};

您正确地专门化了模板参数Enable,一切正常。

如果你想专门化第一个,你应该按类型输入,这可能不是你想要的

template <>
struct Class<std::enable_if<std::is_integral<int>::value, int>::type> {
};