2014-05-23 42 views
0

我通常從不寫C++,而今天我嘗試過使用C++模板進行實驗。我實現了一個也許鍵入它看起來像這樣無法推斷'std :: function'的模板參數

#include <functional> 
#include <iostream> 
#include <string> 
template<typename T> 
class TMaybe 
{ 
    T value; 
public: 
    TMaybe() : value(nullptr){} 
    TMaybe(T &&v) : value(v){} 
    TMaybe(T v) : value(v){} 
}; 

template<typename T, typename R> 
TMaybe<R> maybe_if(const TMaybe<T> &m, std::function<R(T v)> f){ 
    return (m.value != nullptr) ? TMaybe<R>(f(m)) : TMaybe(); 
} 

int main(){ 
    int i = 10; 
    auto m = TMaybe<int>(i); 
    auto plus_ten = [](int i) -> int {return i + 10;}; 
    maybe_if(m, plus_ten); // could not deduce template argument for 'std::function<R(T)>' from 'main::<lambda_17413d9c06b6239cbc7c7dd22adf29dd>' 
} 

但錯誤信息could not deduce template argument for 'std::function<R(T)>' from 'main::<lambda_17413d9c06b6239cbc7c7dd22adf29dd>'是不是非常有幫助。你能發現錯誤嗎?

+2

這不是什麼'的std :: function'是。請將該參數改爲模板參數。 –

+0

@ R.MartinhoFernandes你能告訴我這個語法嗎? –

+2

即使在標記行之前,您仍然有編譯錯誤。你在使用微軟編譯器嗎?更重要的是,你的設計被打破了。 C++不是Java。你不能將'nullptr'推入任何隨機類型。嘗試實例化TMaybe 或其他任何東西。 –

回答

3

如果您通過std::function<R(T)>的實際實例,編譯器只能從f推導出R;傳遞一個lambda將不起作用,因爲lambda不是專門化的一個實例。

編寫代碼的正確方法是允許任何類型的函子,並從中推斷R

template<typename T, typename F, typename R = typename std::result_of<F(T)>::type> 
TMaybe<R> maybe_if(const TMaybe<T> &m, F f){ 
    return (m.value != nullptr) ? TMaybe<R>(f(m.value)) : TMaybe(); 
} 
+0

當我用你的模板(g ++ - 4.8)替換原始源代碼時,它仍然報告了很多錯誤。 –

+0

@OlafDietsche當然,代碼還有很多其他問題。但我確定OP可以自己解決它們。 – ecatmur

+0

「我通常從不寫C++,今天我嘗試過使用C++模板進行實驗。」,我希望如此。 –

相關問題