Lambda作为成员函数模板的默认参数

奥苏瓦尔多

头文件

#include <functional>

struct Check {};
struct Entry {};
struct Table {};

class SeatEntries
{
public:
    // does not compile!
    template<class T>
    void Populate(T from,
                  std::function<bool (Entry *)> predicate = [] (Entry *) { return true; },
                  std::function<void (Entry *)> action = [] (Entry *) {})
    {
        Reset();
        PopulateImpl(from, predicate, action);
    }

    // compiles!
    void PopulateFromCheck(Check *from,
                  std::function<bool (Entry *)> predicate = [] (Entry *) { return true; },
                  std::function<void (Entry *)> action = [] (Entry *) {})
    {
        Reset();
        //PopulateImpl(from, predicate, action);
    }

    void Reset();

private:
    template<class T>
    void PopulateImpl(T from,
                      std::function<bool (Entry *)> predicate,
                      std::function<void (Entry *)> action);
};

template<>
void SeatEntries::PopulateImpl<Table *>(Table *from, std::function<bool (Entry *)> predicate, std::function<void (Entry *)> action);

template<>
void SeatEntries::PopulateImpl<Check *>(Check *from, std::function<bool (Entry *)> predicate, std::function<void (Entry *)> action);

问题

为什么第一个成员函数模板不编译?这是VS2012和gcc 4.8.1中的错误吗?我是否不了解有关成员函数模板和lambda作为默认参数的某些事实?

VS2012输出

error C2958: the left parenthesis '(' found at 'seathelpers.h(33)' was not matched correctly  
error C2988: unrecognizable template declaration/definition  
error C2059: syntax error : '{'  
error C2334: unexpected token(s) preceding '{'; skipping apparent function body  

引用的左括号是Populate()函数模板的左括号。

GCC 4.8.1(MinGW)

Test.h:13:66: internal compiler error: in push_class_level_binding_1, at cp/name-lookup.c:3019  
    std::function<bool (Entry *)> predicate = [] (Entry *) { return true; },  
                                               ^
山姆·瓦尔沙夫奇克

我能够使用gcc 4.8.3正确编译以上代码

$ g++ --version
g++ (GCC) 4.8.3 20140624 (Red Hat 4.8.3-1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将成员函数作为参数传递给函数模板

来自分类Dev

可变参数函数模板接受任何指针(指向变量,函数,成员函数等)作为参数

来自分类Dev

使用默认参数的C ++函数模板

来自分类Dev

可变参数模板函数接受lambda

来自分类Dev

可变参数模板函数接受lambda

来自分类Dev

以成员函数指针为参数的可变参数模板

来自分类Dev

可变参数模板类-可变参数成员函数

来自分类Dev

完美转发可变参数模板参数到成员函数

来自分类Dev

将成员函数传递给可变参数模板函数

来自分类Dev

使用成员函数调用可变参数模板函数

来自分类Dev

函数模板的非最后默认模板参数

来自分类Dev

C++静态模板类成员作为朋友模板函数默认参数

来自分类Dev

可变参数模板成员函数的部分专业化

来自分类Dev

类型擦除和可变参数模板化成员函数

来自分类Dev

C ++使用可变参数模板绑定成员函数

来自分类Dev

折叠可变参数模板检查成员函数的存在

来自分类Dev

具有单个参数模板的成员函数包装器?

来自分类Dev

专业化可变参数模板成员函数

来自分类Dev

如何基于作为STL容器的模板参数模拟所选成员函数的部分专业化?

来自分类Dev

ref合格的成员函数作为模板参数?

来自分类Dev

成员函数作为功能模板的参数

来自分类Dev

为不同版本的函数模板识别不同的默认参数

来自分类Dev

将函数模板原型作为参数传递

来自分类Dev

将函数模板原型作为参数传递

来自分类Dev

C ++结构函子作为函数模板参数

来自分类Dev

使用原始指针作为参数的函数模板推导

来自分类Dev

如何使可变参数模板类方法以函数指针作为从函数模板派生的类型作为参数?

来自分类Dev

以可变参数类模板作为函数调用参数的函数模板参数推导

来自分类Dev

是否可以从函数模板返回可变参数的lambda?

Related 相关文章

  1. 1

    将成员函数作为参数传递给函数模板

  2. 2

    可变参数函数模板接受任何指针(指向变量,函数,成员函数等)作为参数

  3. 3

    使用默认参数的C ++函数模板

  4. 4

    可变参数模板函数接受lambda

  5. 5

    可变参数模板函数接受lambda

  6. 6

    以成员函数指针为参数的可变参数模板

  7. 7

    可变参数模板类-可变参数成员函数

  8. 8

    完美转发可变参数模板参数到成员函数

  9. 9

    将成员函数传递给可变参数模板函数

  10. 10

    使用成员函数调用可变参数模板函数

  11. 11

    函数模板的非最后默认模板参数

  12. 12

    C++静态模板类成员作为朋友模板函数默认参数

  13. 13

    可变参数模板成员函数的部分专业化

  14. 14

    类型擦除和可变参数模板化成员函数

  15. 15

    C ++使用可变参数模板绑定成员函数

  16. 16

    折叠可变参数模板检查成员函数的存在

  17. 17

    具有单个参数模板的成员函数包装器?

  18. 18

    专业化可变参数模板成员函数

  19. 19

    如何基于作为STL容器的模板参数模拟所选成员函数的部分专业化?

  20. 20

    ref合格的成员函数作为模板参数?

  21. 21

    成员函数作为功能模板的参数

  22. 22

    为不同版本的函数模板识别不同的默认参数

  23. 23

    将函数模板原型作为参数传递

  24. 24

    将函数模板原型作为参数传递

  25. 25

    C ++结构函子作为函数模板参数

  26. 26

    使用原始指针作为参数的函数模板推导

  27. 27

    如何使可变参数模板类方法以函数指针作为从函数模板派生的类型作为参数?

  28. 28

    以可变参数类模板作为函数调用参数的函数模板参数推导

  29. 29

    是否可以从函数模板返回可变参数的lambda?

热门标签

归档