以下代码由于“错误:重新定义‘template 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);
}
但是这两个函数在模板实例化时显然会有不同的签名。那么为什么不能编译呢?
请注意:我知道如何解决这个问题:只需向其中一个函数添加另一个虚拟模板参数,例如typename=void
,就可以解决问题,就像这样:
template<typename Integer, typename dummy=void, typename = typename
std::enable_if<std::is_integral<Integer>::value>::type>
void func(Integer integer){}
但问题是,为什么我需要这样做呢?