问题描述
我有两个类,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,Point2f(27,1000),Point2f(1800,1000) },Point2f=Point2f(1920,1080),1080));
};
BEVTest 类包含函数 runtests()
,它在 for 循环中调用函数 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 对象并行执行 process 函数。
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,jsonObjects[i]));
和
processingThread.emplace_back(std::async(std::launch::async,jsonObjects[i],ROIBBox,InputDim));
仍然出现错误。
注意:
如果我打电话,我可以毫无错误地调用 std::async
同一个类的函数来自同一个类的另一个函数
它有一个 for
循环,如 mentioned in this answer. 只有当我调用一个函数时
与另一个具有 for
循环的类不同的类,我是
面对错误。
编辑:尝试评论后
processingThread.emplace_back(std::async(std::launch::async,&cbevObj,RoiBBox,InputDim));
或者不将默认值传递给 process()
processingThread.emplace_back(std::async(std::launch::async,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,_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);
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,Point2f(27,1000),Point2f(1800,1000) },Point2f=Point2f(1920,1080),1080));
所以它期望第一个参数作为对 json
对象的非常量引用。因此,对 std::async
的调用应该是(未经测试的)...
processingThread.emplace_back(std::async(std::launch::async,&CameraToBEV::process,&cbevObj,std::ref(jsonObjects[i])));
(注意 std::ref
的使用)