我正在尝试为整数类型创建部分特化。我的想法是做类似的事情:
#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> {
};
为什么我需要额外的模板参数?
最佳答案
在第一种情况下,您没有专门学习该类(class)。 当你写:
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> {
};
关于templates - 为什么enable_if不能用于特殊参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426873/