我有两个课,CameraToBEV
和BEVTest
。该CameraToBEV
包含函数process()
。
class CameraToBEV :
{
public:
CameraToBEV(std::vector<Point2f>, cv::Point2f, cv::Point2f);
/*
process(json Object, ROI Bounding box, Output Dimensions, Input Dimensions)
*/
cv::Mat process(json&, std::vector<Point2f> = { Point2f(765,57), Point2f(1860,57), Point2f(27, 1000) ,Point2f(1800, 1000) }, Point2f=Point2f(1920,1080), Point2f=Point2f(1920, 1080));
};
BEVTest类包含在for循环中runtests()
调用该函数的函数process()
。
void BEVTest::runTests()
{
CameraToBEV cbevObj(RoiBbox, OutputDim, InputDim);
std::vector<std::future<cv::Mat>> processingThread;
for (int i = 0; i < jsonObjects.size(); i++) {
processingThread.emplace_back(std::async(std::launch::async, &CameraToBEV::process,this, jsonObjects[i]));
}
}
我正在尝试使用进行多线程处理std::async
,for loop
以便对每个JSON对象并行执行处理功能。
但是,当我构建此代码时,出现以下错误;
Error C2672 'std::async': no matching overloaded function found
Error C2893 Failed to specialize function template 'std::future<_Select_invoke_traits<decay<_Ty>::type,decay<_ArgTypes>::type...>::type> std::async(std::launch,_Fty &&,_ArgTypes &&...)'
所以我尝试了另一种呼叫方式 std::async
processingThread.emplace_back(std::async(std::launch::async, &cbevObj.process,this, jsonObjects[i]));
和
processingThread.emplace_back(std::async(std::launch::async, &cbevObj.process,jsonObjects[i]));
和
processingThread.emplace_back(std::async(std::launch::async, &cbevObj.process,jsonObjects[i], ROIBbox, OutputDim, InputDim));
不过,我仍然遇到错误。
注意:
std::async
如果我从具有for
循环的同一个类的另一个函数中调用同一个类的函数,则可以没有任何错误或问题地进行调用,如本答案所述。只有当我从另一个具有for
循环的类中调用另一个类的函数时,我才遇到错误。
编辑:尝试评论后
processingThread.emplace_back(std::async(std::launch::async, &CameraToBEV::process,&cbevObj, jsonObjects[i], RoiBbox, OutputDim, InputDim));
并且交替地不将默认值传递给process()
processingThread.emplace_back(std::async(std::launch::async, &CameraToBEV::process,&cbevObj, jsonObjects[i]));
错误是:
Error C2672 'std::async': no matching overloaded function found
Error C2893 Failed to specialize function template 'std::future<_Select_invoke_traits<decay<_Ty>::type,decay<_ArgTypes>::type...>::type> std::async(std::launch,_Fty &&,_ArgTypes &&...)'
Error C2672 std::vector<std::future<cv::Mat>,std::allocator<std::future<cv::Mat>>>::emplace_back': no matching overloaded function found
在BEVTests中声明jsonObjects:
class BEVTest
{
Point2f InputDim, OutputDim;
std::vector<Point2f> RoiBbox;
std::string outputPath, inputJsonPath;
std::vector<json> jsonObjects;
public:
BEVTest(std::string, std::string, std::vector<cv::Point2f>, cv::Point2f, cv::Point2f);
void loadData();
void runTests();
json parseJson(std::string);
};
根据注释,如果要使用std :: async运行的成员函数是,CameraToBEV::process
则紧随其后传递的参数&CameraToBEV::process
应该是指向有效CameraToBEV
实例的指针。
另外,std::async
默认情况下,将按值传递参数。但是,您正在调用的函数具有签名...
cv::Mat process(json&, std::vector<Point2f> = { Point2f(765,57), Point2f(1860,57), Point2f(27, 1000) ,Point2f(1800, 1000) }, Point2f=Point2f(1920,1080), Point2f=Point2f(1920, 1080));
因此,它希望第一个参数是对json
对象的非常量引用。std::async
因此,应致电(未试用)...
processingThread.emplace_back(std::async(std::launch::async, &CameraToBEV::process, &cbevObj, std::ref(jsonObjects[i])));
(注意使用std::ref
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句