我正在尝试为整数类型创建部分特化。我的想法是做类似的事情:
#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> {
};
为什么我需要额外的模板参数?
答案 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> {
};