作爲一個練習(注意,我知道std :: transform),我試圖實現通常在函數式語言上找到的映射函數,例如C++中的Haskell 。這是我的代碼:g ++無法推斷功能圖實現的模板類型
#include <iostream>
#include <vector>
#include <functional>
template<typename A, typename B>
std::vector<B> functional_map (std::function<B(A)> func, std::vector<A> v)
{
std::vector<B> result(v.size());
for(int i = 0; i < v.size(); ++i) {
result[i] = func(v[i]);
}
return result;
}
儘管如此,當這樣調用編譯器無法正確推斷functional_map模板類型:
int square (int x) {return x*x;}
int main()
{
std::vector<int> v = {1,2,3,4,5,6,7,8,9,10};
std::vector<int> v2 = functional_map(square, v);
for (int y : v2) {
std::cout << y << " ";
}
}
這是G ++所產生的錯誤:
functional_cpp.cpp: In function ‘int main()’:
functional_cpp.cpp:18:35: error: no matching function for call to ‘functional_map(int (&)(int), std::vector<int>&)’
vector<int> v2 = functional_map(square, v);
^
functional_cpp.cpp:6:44: note: candidate: template<class A, class B> std::vector<B> functional_map(std::function<B(A)>, std::vector<A>)
template<typename A, typename B> vector<B> functional_map (function<B(A)> func, vector<A> v) {
^
functional_cpp.cpp:6:44: note: template argument deduction/substitution failed:
functional_cpp.cpp:18:35: note: mismatched types ‘std::function<B(A)>’ and ‘int (*)(int)’
vector<int> v2 = functional_map(square, v);
顯然,克++失敗以匹配正則函數指針std::function
類型,它是由使所有功能一致的打字在C++中。請注意,由拉姆達改變方也沒有編譯(但類型正在對變化相匹配,從nt (&)(int)
到lambda(int)
。
話雖這麼說,改變functional_map
到functional_map<int, int>
編譯成功,並用正確的結果執行。
這是爲什麼發生了什麼?我怎樣才能解決我的實現,因此編譯器會推斷出模板類型?
編輯爲了避免混淆std::map
,作爲意見建議我在更名「地圖」與「functional_map」所有問題
'使用namespace std'並聲明像'map'和'list'這樣的名字似乎是災難的祕訣。已經停止濫用命名空間,並且無論誰告訴你幾次在頭部周圍說'使用命名空間標準'。 –
@KerrekSB我很清楚這一點,感謝您的反饋。正如我在文章中提到的那樣,這是一個快速練習,所以我並不打擾stl友好,我只是想避免輸入std ::一堆,如果必須的話,把它當作骯髒的黑客。無論如何,也許我應該改變我的問題,不要混淆未來的讀者? – Setzer22
我並沒有因爲對* meducating *用戶的困惑而迷惑讀者。想想那些在你的帖子中發生的可憐的無辜者,並且他們的可塑性大腦中植入了更多的潛意識信息,這是可以接受的代碼... –