4

根据[expr.prim.lambda]以下代码似乎没问题:

#include<functional>

typedef int(*func1)(int);
typedef std::function<int(int)> func2;

int function(int)
{
    return 0;
}

template<typename F = func1>
int function1(F f = function)
{
    return 0;
}

template<typename F = func2>
int function2(F f = function)
{
    return 0;
}

template<typename F = func1>
int function3(F f = [](int i){return 0;})
{
    return 0;
}

template<typename F = func2>
int function4(F f = [](int i){return 0;})
{
    return 0;
}

但是,gcc(4.8.1)抱怨function3function4显示错误

包含“__lambda”的类的模板参数的默认参数

有人可以解释这个错误吗?

4

1 回答 1

2

我可以建议一个解决方法吗?

删除function3(and function4) 的默认模板参数:

template<typename F>
int function3(F f = [](int i){return 0;})
{
    return 0;
}

你可以这样称呼它:

function3<func1>();

但我想你希望能够像这样打电话:

function3();

不是吗?然后,创建另一个重载,function3它是一个函数而不是模板函数:

int function3(func1 f = [](int i){return 0;})
{
    return function3<func1>(f);
}
于 2013-08-12T09:42:11.067 回答