尝试传递另一个类

时间:2016-03-30 06:44:52

标签: function templates c++11 lambda function-pointers

我一直在尝试将类的成员函数分配给std :: function,但它会抛出编译时错误无法专门化函数模板'unknown-type std :: invoke(_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方法分配给std :: 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函数,main与createTypeTable具有相同的主体),它工作正常。

任何想法都错了吗?

2 个答案:

答案 0 :(得分:0)

是的,问题出在这一行:

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

我看不出这是正确的操作。您引用了member function的{​​{1}}。此class可能需要修改或阅读member function member variables中的一个class。它不是free function。它是应为特定class调用的object的一部分。所以C ++否认这一点是正常的。

修改

我发现了https://isocpp.org/wiki/faq/pointers-to-members#memfnptr-vs-fnptr

  

如何将指向成员函数的指针传递给信号处理程序,X事件回调,启动线程/任务的系统调用等?

     

别。

     

因为如果没有要调用它的对象,成员函数就没有意义,   你不能直接这样做(如果X Window系统被重写了   C ++,它可能会传递对周围对象的引用,而不仅仅是   函数指针;自然地,物体将体现所需的   功能,可能还有很多)

答案 1 :(得分:0)

问题是我没有将方法绑定到任何对象。改变

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

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

的工作。