为什么这个功能不能被一个明显不同的签名重载?

Rus*_*lan 6 c++ templates overloading

由于以下代码无法编译 error: redefinition of ‘template<class Integer, class> void func(Integer)’

#include <iostream>
#include <type_traits>

template<typename Float, typename = typename 
std::enable_if<std::is_floating_point<Float>::value>::type>
void func(Float floatVal)
{
    std::cerr << "float: " << floatVal << "\n";
}

template<typename Integer, typename = typename 
std::enable_if<std::is_integral<Integer>::value>::type>
void func(Integer integer)
{
    std::cerr << "integral: " << integer << "\n";
}

int main()
{
    func(32.4246);
    func(144532);
}
Run Code Online (Sandbox Code Playgroud)

但是这两个函数在模板实例化上显然会有不同的签名.那为什么不能编译呢?

请注意:我确实知道如何解决这个问题:只需在其中一个函数中添加另一个虚拟模板参数,例如typename=void,就可以了,就像这里一样

template<typename Integer, typename dummy=void, typename = typename 
std::enable_if<std::is_integral<Integer>::value>::type>
void func(Integer integer){}
Run Code Online (Sandbox Code Playgroud)

但问题是为什么我必须这样做?

cpp*_*ner 5

N4527§1.3.19[defns.signature.templ]

签名

<function template> name,parameter type list(8.3.5),enclosing namespace(if any),return type和template parameter list

默认模板参数不是函数模板签名的一部分.