2017-03-15 3 views
1

私は、このサンプルのC++コードをコンパイルするために使用するものをG ++コンパイラのパラメータを見つけるためにしようとしています:ファンクタをstd :: functionのテンプレートパラメータとして使用することは可能ですか?

CPPの参照で
#include <stdio.h> 
#include <functional> 

struct mystruct 
{ 
    int a; 
    int operator()(int y) { return y + 1; } 
}; 

int main() 
{ 
    std::function<mystruct> foo; 
    return 0; 
} 

はSTD ::関数テンプレートパラメータが「他の関数オブジェクト...または」できることを書かれています。私はいくつかの標準を含む大規模なプロジェクトに取り組んでいます::関数とプロジェクトはg ++でビルド可能です。私は文句を言い、このようなコードにVS2015が、コンパイラの下でそれを構築しようとしています:

エラーC2027:未定義のタイプの使用 'のstd :: _ Get_function_impl < _Fty>' と [ _Fty =体mystruct ]

エラー:集計「のstd ::関数」不完全なタイプがあり、

を定義することはできませんがだから私はで考える私は++ 11、それはまたcomlains -std = Cとg ++の下に小さなサンプルの上にコンパイルしよう私たちの大きなビルド可能なプロジェクトg ++はおそらくこのような機能を提供する拡張機能をいくつか変更したでしょう。

+2

ここで、テンプレートパラメータは関数型以外のもの(例: 'int(double、char)')であることがわかりますか? cppreferenceは関数オブジェクトを格納できることを示しています。とにかく、 'mystruct'に複数の' operator() 'オーバーロードがあった場合、または' operator() 'がテンプレート化されていた場合はどうなりますか?それは安全に型打ち署名を消去することはできません。 – chris

答えて

3

おそらく、テンプレートの引数を格納する関数オブジェクトと混在させました。私はあなたが書いてみたいと信じています

std::function<int(int)> foo{mystruct{}}; 
0

答えは、ファンクタは他のファンクタにパラメータをテンプレートすることはできません。すべての投稿ありがとう。

関連する問題