私は非常に奇妙な問題があります。物事をシンプルに保つために、私はcstdioをからputchar
を取り、putchar
に一致するように同一の機能を作成した事を試すために、引数テンプレート関数としてラムダ
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
と同じ宣言で2つの機能を取る機能を持つようにしたいと言うことができます。今
int myPutcharFunc(int)
{
return 0;
}
int main()
{
auto myPutcharLambda = [](int) -> int
{
return 0;
};
foo(putchar, myPutcharFunc); // okay
foo(putchar, myPutcharLambda); //deduced conflicting types for parameter 'Func' ('int (__attribute__((__cdecl__)) *)(int)' and 'main()::<lambda(int)>')
}
、ラムダは、(キーは、私はラムダ・キャプチャーを使用したいです)をコンパイルする必要はありません。
プログラマがマシンよりも賢いので、テンプレートの特殊化を追加できますか? :)
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
いいえ、同じエラー - なぜですか? しかし、私はテンプレートの特殊化をコメントアウト何らかの理由で、用:
は//template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
コードがコンパイルされます。私は明らかに関数の引数のすべてのセットのためにfoo
をオーバーロードしたくない - それはどのようなテンプレートであるか。すべてのステップは、msvC++とg ++の両方でテストされました。私は間違って何をしていますか?あなたは(補正のためのCOMMENTを参照)、テンプレートの種類を推定する際
template<typename FuncA, typename FuncB>
void foo(FuncA a, FuncB b)
タイプが減衰していないそれらを得るために、2つの異なるテンプレートパラメータを持っている必要がありますので、
* "テンプレートの種類を推定する際の種類は減衰していない" *もちろん彼らはありません。 * "同じ理由は、文字列リテラルがconst char *" *の代わりにchar [N]として推論されるのと同じですが、生の文字列リテラルはconst char * –
@PiotrSkotnickiとして引き合いに出されます。私は他のいくつかの援助でそれについて読んでいただけです。 – xaxxon
関数パラメータが参照型の場合 –