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)
但问题是为什么我必须这样做?
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
默认模板参数不是函数模板签名的一部分.
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |