14

Visual Studio 11ベータ版を使用していますが、クラスにstd::functionオブジェクトを格納する際に発生するコンパイルエラーについて知りたいです。

typedef std::function<void (int, const char*, int, int, const char*)> MyCallback;

私のクラスでは、

MyCallback m_callback;

これは問題なくコンパイルされます。リストにもう1つの引数を追加すると、失敗します。

typedef std::function<void (int, const char*, int, int, const char*, int)> MyCallback;

失敗は次のとおりです。

>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(535): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (int,const char *,int,int,const char *,int)
1>          ]
1>          f:\development\projects\applications\my.h(72) : see reference to class template instantiation 'std::function<_Fty>' being compiled
1>          with
1>          [
1>              _Fty=void (int,const char *,int,int,const char *,int)
1>          ]
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(536): error C2504: 'type' : base class undefined
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (int,const char *,int,int,const char *,int)
1>          ]
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2146: syntax error : missing ';' before identifier '_Mybase'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

これは動的にリンクされたライブラリであり、別のアプリケーションに渡すデータを準備しています。確かにデータの形式を作り直して、より少ない引数で渡すことができるようにすることはできますが、なぜこの制限が表示されるのか疑問に思いました。

c-style関数ポインタに戻り、

 typedef void (*MyCallback)(int, const char*, int, int, const char*, int);

うまくいくようです。

4

1 に答える 1

37

この制限は、VisualStudioでの実装によって設定されます。

のC++仕様にstd::functionは制限はありません。std::function可変個引数テンプレートを使用して、任意の数の引数を処理します。実装には、たとえば、テンプレートのインスタンス化のネスト制限に基づいた制限がある場合がありますが、それは大きくする必要があります。仕様では、たとえば、サポートされるネストの深さの最小値として1024、1回の関数呼び出しで許可される引数の最小値として256が推奨されています。

Visual Studio(VS11以降)には可変個引数テンプレートがありません。VS11では最大5つの引数をシミュレートしますが、最大10に変更できます。これ_VARIADIC_MAXは、プロジェクトで定義することによって行います。これにより、コンパイル時間が大幅に増加する可能性があります。

更新:VS 2012 Nov CTPは可変個引数テンプレートのサポートを追加しますが、それらを使用するための標準ライブラリはまだ更新されていません。更新されると、で必要な数の引数を使用できるようになりますstd::function

于 2012-04-10T15:55:06.397 に答える