2017-09-25 42 views
2

通過this blog有所啓發,我想我會嘗試在C上創建一個廣義函數子類++。我不會出去很多。我用它作爲正確理解模板的藉口,而不僅僅是討論。的std ::功能模板的模板參數

#include <functional> 

template<template <typename> typename F_, typename A> 
struct Functor { 

    template<typename B> 
    static F_<B> fmap 
     (std::function<B(A)> 
     , F_<A> 
    ); 

}; 


template<typename A> 
struct Functor<std::function, A(void)> {}; 

template<typename A> 
template<typename B> 
    std::function<B()> Functor<std::function, A(void)>::fmap 
    (std::function<B(A)> f 
    , std::function<A()> fA 
    ){ 
    return [&](){ 
    return f (fA()); 
    }; 
}; 

經過相當多的混亂之後,我很難過。我有編譯器錯誤

error: no ‘std::function<B()> Functor<std::function, A()>::fmap(std::function<B(A)>, std::function<A()>)’ member function declared in class ‘Functor<std::function, A()>’ 

我迷路了。坦率地說,我雖然已經宣佈了這一點。有什麼建議麼?我正在編譯使用最新的編譯器,使用C++ 17的gcc 7.2。我認爲C++ 14是所有需要的。

順便說一句,我可以很愉快地編譯FMAP

的非普通版
template<typename A, typename B> 
std::function<B(void)> fmap1 
    (std::function<B(A)> f 
    , std::function<A(void)> fA 
    ) 
{ 
    return [&](){ 
     return f (fA()); 
    }; 
}; 

回答

3

您部分專門Functor。沒關係,但是你的專業化並沒有宣佈任何成員。具體而言,沒有fmap成員。回想一下,專業化不會自動從主模板獲取任何內容。

所以只需添加聲明:

template<typename A> 
struct Functor<std::function, A(void)> 
{ 
    template<typename B> 
    static std::function<B()> fmap 
     (std::function<B(A)> 
     , std::function<A()> 
    ); 
}; 
+0

謝謝。我在模板中生鏽了一點。這完全是工作 – OllieB

+0

@OllieB - 你的意思是問題嗎?請不要。它會使我的答案失效。如果你有一個問題,請問(如在後)一個新問題。 – StoryTeller

+0

對不起,是的。你的回答不包括任何代碼,當我評論 – OllieB