尝试
auto p = static_cast<void(*)()>(& h<int>);
因为gcc对待模板用作重载之一。从海湾合作委员会的角度来看,它就像你会有h(int param)
和h(float param)
- 编译器必须选择哪一个?
我注意到旧版本的gcc有什么问题,但我会试着更详细地解释它。 GCC无法推断出该类型,因为模板化函数被视为超载。这基本上就像你具备以下条件:
void h(int)
{
}
void h(float)
{
}
void (*p)(int) = & h; //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
海合会h<int>
简直就像重载h
函数依赖于T
参数无尽的替代品。有问题的代码是O.K.做到以下几点:
void (*p)() = & h<int>;
(这就是为什么我没有得到通过typedef“变通”)
,因为我以为OP想用C++ 11 auto
通过关键字标签的建议,我静态铸造了h<int>
到void(*)()
,这是一种无操作,只是为了欺骗gcc,因为它无法正确处理模板化函数和auto
。
函数void h<int>()
和void h<float>()
当然应该被当作具有相同指针类型的不同函数处理,而不是h
函数的超载版本。实例化时,他们应该表现得像void hInt()
和void hFloat()
,你应该能够使用自动喜欢这里:
void hInt()
{
}
void hFloat()
{
}
auto p = hInt;
p = hFloat;
但由于某些原因海合会他们喜欢的h
重载版本。
请给出downvotes的原因。
来源
2010-09-04 09:53:09
doc
在Visual Studio 2010上编译得很好。这很可能是GCC中的一个小故障。你可以尝试的是'decltype(&h)p =&h ;' –
Puppy
2010-09-04 09:53:30
至少可以和G ++ 4.6一起使用。 – Maister 2010-09-12 10:38:17
@DeadMG:如果没有“auto”,甚至不需要typedef,'void(* p)()=&h;'也会编译。 –
doc
2010-09-12 15:34:47