以下代码之间有什么区别,为什么一个有效,另一个无效?

She*_*win 4 c++ templates enable-if

我想定义一个函数,其行为取决于它的参数是否是pod类型,我这样做有两种方式:

第一

template <typename T, typename = typename std::enable_if<std::is_pod<T>::value>::type>
void f(const T&) {
    //...
}
template <typename T, typename = typename std::enable_if<!std::is_pod<T>::value>::type>>
void f(const T&) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

第二

template <typename T>
typename std::enable_if<std::is_pod<T>::value>::type f(const T&) {
    //...
}
template <typename T>
typename std::enable_if<!std::is_pod<T>::value>::type f(const T&) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

第二个很好,而第一个是错误.编译器抱怨在第一种情况下重新定义f.我想知道他们之间的区别.为什么第一个是错误.

谢谢你的阅读,请帮助我!

Pio*_*cki 7

模板参数列表上的默认参数不是函数签名的一部分,因此,两个重载具有来自编译器角度的相同签名.相反,您可以自己std::enable_if创建模板参数的结果:

template <typename T, typename std::enable_if<std::is_pod<T>::value, int>::type = 0>
void f(const T&) {}

template <typename T, typename std::enable_if<!std::is_pod<T>::value, int>::type = 0>
void f(const T&) {}
Run Code Online (Sandbox Code Playgroud)