2017-09-25 86 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