C ++模板函数无匹配调用

时间:2013-08-07 19:31:51

标签: c++ templates c++11 compiler-errors

我正在尝试通过vectorlist等STL容器提供通用映射功能。这是我的实施:

#include <functional>
#include <algorithm>


template<class A, class B, template <class> class F>
F<B> fmap(F<A> &functor, std::function<B(A)> &f)
{
  F<B> newFunctor;

  return std::transform(begin(functor)
                , end(functor)
            , begin(newFunctor)     
            , f);
}

但是当我尝试用代码调用它时:

vector<int> v;

for(int i = 0; i < 5; i++) {
  v.push_back(i);
}

vector<int> w = fmap(v, [](int i) { return i + 1; });

我收到no matching function call错误。

我怎样才能让它发挥作用?

3 个答案:

答案 0 :(得分:2)

代码中有一些问题。首先,正如已经指出的那样,std::vector模板需要2个模板参数,存储类型和分配器。即使第二个默认为使用存储类型的std::allocator实例化,它仍然是模板的参数。

您将遇到的第二个问题是虽然您可以从lambda创建std::function,但lambda表达式不是std::function,因此编译器将无法匹配第二个参数。

答案 1 :(得分:0)

vector 有2个模板参数

template < class T, class Alloc = allocator<T> > class vector; 

答案 2 :(得分:0)

通过假设所有适用的容器类型都是第一个参数是值类型的模板类,您可以从容器类型的确切声明结构中获得一些独立性。对于输出,生成具有不同值类型的容器,并且所有其他模板参数都相同。对于可以重新绑定具有不同值类型的容器的类型特征,这是可能的:

template <typename Container>
struct container_rebind;

template <template <typename...> class Container, typename ValueType, typename... OtherArgs>
struct container_rebind<Container<ValueType, OtherArgs...>> {
    template <typename NewValueType>
    using rebind = Container<NewValueType, OtherArgs...>;
};

template <typename Container, typename NewValueType>
using ContainerRebind = typename container_rebind<Container>::template rebind<NewValueType>;

所以,例如,ContainerRebind<std::vector<int>, double>std::vector<double>。可以部分专门化container_rebind来支持其他类型的容器模板,例如那些具有非类型模板参数的容器模板。例如,添加对std::array的支持留待读者阅读。