嘗試
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