我目前正在编写一个小的助手模板库,在使用
std::enable_if
使用模板参数。
这些函数模板在GCC 7.1中编译得很好:
template<typename T, std::enable_if_t<std::is_same_v<int, T>, T>* = nullptr>
void f() { };
template<typename T, std::enable_if_t<std::is_same_v<double, T>, T>* = nullptr>
void f() { };
int main()
{
f<int>();
f<double>();
}
而这些结构模板提供编译错误:
template<typename T, std::enable_if_t<std::is_same_v<int, T>, T>* = nullptr>
struct f { };
template<typename T, std::enable_if_t<std::is_same_v<double, T>, T>* = nullptr>
struct f { };
int main()
{
f<int> x;
f<double> y;
}
错误:
main.cpp:36:70: error: template parameter âstd::enable_if_t<is_same_v<int, T>, T>* <anonymous>â
template<typename T, std::enable_if_t<std::is_same_v<int, T>, T>* = nullptr>
^~~~~~~
main.cpp:40:12: error: redeclared here as âstd::enable_if_t<is_same_v<double, T>, T>* <anonymous>â
struct f { };
^
我很难理解为什么编译器会抱怨结构:
-
存在第二个模板参数的默认值。
-
重新声明结构,即使两者都有不同的模板参数列表。