我有一個很奇怪的問題。爲了簡單起見,可以說,我想有一個函數,它接受2個相同的函數聲明作爲參數Lambda作爲模板函數
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
要嘗試的事情了我帶着putchar
從cstdio,並創建了一個相同的功能相匹配的putchar
。
int myPutcharFunc(int)
{
return 0;
}
int main()
{
auto myPutcharLambda = [](int) -> int
{
return 0;
};
foo(putchar, myPutcharFunc); // okay
foo(putchar, myPutcharLambda); //deduced conflicting types for parameter 'Func' ('int (__attribute__((__cdecl__)) *)(int)' and 'main()::<lambda(int)>')
}
現在,lambda不想編譯(關鍵是我想用lambda捕獲)。
因此,讓我們添加模板專業化,因爲程序員比機器更聰明,對吧? :)
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
沒有運氣,同樣的錯誤 - 爲什麼? 但由於某些原因,當我註釋掉模板特殊化:
//template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
代碼編譯。我顯然不想爲每一組函數的參數重載foo
- 這就是模板的用途。每個步驟都使用msvC++和g ++進行測試。我究竟做錯了什麼?
* 「演繹模板類型時,類型不衰」。 *「相同的原因,字符串文字被推斷爲char [N]而不是const char *」*,原始字符串文字被推斷爲const char * –
@PiotrSkotnicki它是什麼時候作爲char數組出現呢?我只是在其他一些問題上讀到這個。 – xaxxon
功能參數爲參考類型時 –