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(および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 に答える