2012-10-17 41 views
13

ラムダ式std::function<double()>に割り当てています。ラムダ関数で三項演算子が機能しない

error: no match for ternary ‘operator?:’ in <awfully long template error, because this whole thing is in a class defined in a function...> 

これはgccのバグです(私は4.7を使用しています:私は、三項演算

k.*variable = (fn_type==exponential ? [=,&k](){ return initial*exp(-k.kstep*par); } : [=,&k](){ return initial*pow(k.kstep, par); }); 

を使用したい場合、私は次のエラーを取得するのに対し、このスニペットは

if(fn_type==exponential) 
    k.*variable = [=,&k](){ return initial*exp(-k.kstep*par); }; 
else 
    k.*variable = [=,&k](){ return initial*pow(k.kstep, par); }; 

の作品2)?さもなければ、標準にこの限界があるのはなぜですか?

答えて

18

条件演算子の第2オペランドと第3オペランドは、同じ型を持たなければなりません。また、両方ともコンパイラが把握できる共通型がなければなりません。コンパイラが考慮する変換は、ほんの一握りです。

2つのラムダ式には異なるタイプがあり、両方を変換できる共通タイプはありません(std::function<double()>などのユーザー定義タイプへの変換は、有効なターゲットタイプが無限にある可能性があるため考慮できません) )。

あなたが直接std::function<double()>にオペランドのそれぞれに変換することができます:

k.*variable = fn_type==exponential 
    ? std::function<double()>([=,&k](){ return initial*exp(-k.kstep*par); }) 
    : std::function<double()>([=,&k](){ return initial*pow(k.kstep, par); }); 
しかし、実際に、それは if/ elseとのクリーナーです。

+2

+1の回答、もう1つの「それはif/elseのクリーナーです」 –