我一直在尝试将类的成员函数分配给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具有相同的主体),它工作正常。
任何想法都错了吗?
答案 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); };
的工作。