2016-03-30 3 views
1

クラスのメンバ関数をstd :: functionに代入しようとしましたが、コンパイル時にエラーが発生しますfunction template 'unknown type std ::呼び出す(_Callable & &、_TYPES & & ...)以下別のクラスのメンバ関数を渡そうとするときに「関数テンプレートを特殊化できませんでした」

そのクラスのヘッダファイルである:以下

class TypeAnalysis { 
public: 
    bool AnalysisHelper(std::string filePath); 
    void createTypeTable(std::string dir, std::string pattern, size_t nThread = 3); 
    std::vector<std::string> getFiles(std::string dir, std::vector<std::string> patterns); 
private: 

}; 

そして、私が割り当てていますcreatetypeTable機能ですAnalysisHelperメソッドを標準:: fnuctionオブジェクトに変換します。

void TypeAnalysis::createTypeTable(std::string dir, std::string pattern, size_t nThread) 
{ 
    Threadpool<bool, std::string> tp(10); 
    DataContext dc; 
    tp.start(); 
    std::vector<std::string> patterns = SH::split(pattern); 
    std::vector<std::string> files = getFiles(dir, patterns); 
    std::function<bool(std::string)> w = &TypeAnalysis::AnalysisHelper; //I think issue is here 
    try { 
     if (files.size() > 0) { 
      for (size_t i = 0; i < files.size(); i++) { 
       WorkItem<bool, std::string> *wi1 = new WorkItem<bool, std::string>(&w, &files[i]); 
       tp.doWork(wi1); 
      } 
     } 
    } 
    catch (std::exception ex) { 
     std::cout << ex.what(); 
     return; 
    } 
    tp.doWork(nullptr); 
    tp.wait(); 
    DataContext::getContextThreadPool().doWork(nullptr); 
} 

私は任意のクラス定義せずに同じことをしようとした

、それがうまく働いた(AnalysisHelperはGlabal関数であったとの主はcreateTypeTableと同じ体を持っていました)。

何が間違っていますか?

答えて

0

はい、問題は、この行である:

std::function<bool(std::string)> w = &TypeAnalysis::AnalysisHelper; 

私は、このように正しい動作を見ることができません。 classmember functionを参照しています。このmember functionは、classmember variablesの1つを編集または読み取る必要があります。 free functionではありません。特定のobjectのために呼び出されるclassの一部です。だから、C++はそれを否定していたのが普通です。

編集:

私は、シグナルハンドラ、Xのイベントコールバック、スレッドを開始し、システムコールへのポインタ・ツー・メンバー関数を渡すにはどうすればよいこのhttps://isocpp.org/wiki/faq/pointers-to-members#memfnptr-vs-fnptr

を見つけました/タスクなど?

しないでください。

メンバ関数を使用すると、直接これを行うことはできません 、それを呼び出すためのオブジェクトずに無意味なので(X Windowシステムが C++に書き直された場合、それはおそらく、周りのオブジェクトにだけではなく を参照を渡します関数へのポインタ、自然のオブジェクトは全体の多くはおそらく必要 機能を具現化してしまう)

0

問題は、私は任意のオブジェクトにメソッドをバインドされていませんでした。

std::function<bool(std::string)> w = [=](std::string file) { return this->AnalysisHelper(file); }; 

std::function<bool(std::string)> w = &TypeAnalysis::AnalysisHelper; 

を変更働きました。

関連する問題