尝试
auto p = static_cast<void(*)()>(& h<int>);
因为gcc将模板函数视为重载函数。从gcc的角度来看,就像你有h(int param)
和h(float param)
一样——编译器该选择哪一个?
我注意到在旧版本的gcc中存在问题,但我会尝试更详细地解释它。GCC无法推断类型,因为模板函数被视为重载函数。基本上就像你有以下内容:
void h(int)
{
}
void h(float)
{
}
void (*p)(int) = & h;
void (*p)(float) = & h;
auto p = & h;
对于gcc而言,h<int>
就像是一个重载的h
函数,具有无数取决于T
参数的替代方案。使用问题中提供的代码,可以这样做:
void (*p)() = & h<int>;
这就是为什么我没有被typedef“work-around”的原因。
正如我所想,OP想要使用c++11的auto
关键字,正如标签所建议的那样,我将h<int>
静态转换为void(*)()
,这种操作有点像无操作,只是为了欺骗gcc,因为它不能正确处理模板函数和auto
。
函数void h<int>()
和void h<float>()
当然应该被视为具有相同指针类型的不同函数,而不是h
函数的重载版本。当实例化时,它们应该像void hInt()
和void hFloat()
一样运行,并且您应该能够在此处使用auto:
void hInt()
{
}
void hFloat()
{
}
auto p = hInt;
p = hFloat;
但是对于gcc来说,它们就像是h
的过载版本,原因不明。
请给出负评的原因。
decltype(&h<int>) p = &h<int>;
- Puppyvoid (*p)() = & h<int>;
也可以编译。 - mip