gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:03:28 25 4
gpt4 key购买 nike

头文件

#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)

关于c++ - Lambda 作为成员函数模板的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com