0

戻り値がラムダ関数 (テンプレート パラメーターによって決定される) へのポインターであるテンプレートを作成する必要があります。

コンパイラのフィードバック:

error: no matching function for call to ‘laptr(int)’

コードの何が問題になっていますか? 問題を解決するには?

#include <iostream>

using namespace std;

template <typename T>
T laptr(int par);

int main(){
    laptr(1);
    return 0;
}

///////////

template <typename T>
T laptr(int par)
{
    if (par == 1)
    {
        int p1 = [](int a, int b)->int{return a*b; };
        return p1;
    }
    else
    {
        double p2 = [](double a, double b)->double{return a + b; };
        return p2;
    }
}
4

2 に答える 2

3

あなたの根本的な問題は次のとおりです。

template <typename T>

...ここでは、コンパイル時にT完全に決定する必要がありますが、

T laptr(int par)

par実行時まで不明であり、かつ:

if (par == 1)
{
    int p1 = [](int a, int b)->int{return a*b; };
    return p1;
}
else
{
    double p2 = [](double a, double b)->double{return a + b; };
    return p2;
}

ここでTは、ステートメントのどの区間ifを実行するかを決定するまでわからないため、タイプは 1) コードのコンパイルが完了する前に知る必要があり、実行については何も言うまでもありませんが、2) 実行するまでは決定できません。コードが実行されます。

明らかに、これらの両方を発生させることはできないため、コードはコンパイルできません。

std::function関数へのポインター、 a 、オブジェクト ( Modern C++ DesignCommandで定義されている) など、かなりの数の代替手段があります。それらはすべて、基本的に同じように機能します。各ラムダの正確な型を返そうとするのではなく、 、どちらかのラムダの型を保持できる共通の型を定義し、代わりにその型のオブジェクトを返します。

于 2013-11-12T17:08:10.847 に答える