更新:
cv::UMat
无疑是)。问题
我目前正在使用OpenCV的
cv::UMat
对象类,我的同事编写了一个函数来添加cv::UMat
,如下所示:UMat addUMats(UMat & M1, UMat & M2){
UMat returnMat;
add(M1, M2, returnMat);
return move(returnMat);}
现在,如果我这样称呼它,效果很好:
cv::UMat A = data1;
cv::UMat B = data2;
cv::UMat C = addUMats(A, B);
但是,当我尝试将函数作为参数传递给函数时,出现“参数必须为左值”类型错误。例如,
cv::UMat A = addUMats(addUMats(alpha, beta), addUMats(alpha, beta));
对于任何有效的
cv::UMats
,alpha, beta
。至今
我做了一点research,发现
std::move(input)
显式返回了rvalue类型的临时类。因此,抛出错误是有道理的。我意识到我可以通过首先执行以下操作来解决此问题:
cv::UMat inputA = addUMats(alpha, beta);
cv::UMat A = addUMats(inputA, inputA);
或者,我什至可以做类似的事情,
UMat addUMats(UMat & M1, UMat & M2){
UMat returnMat;
add(M1, M2, returnMat);
return returnMat;}
在这种情况下,据我了解,
return returnMat
行将导致复制deep(?)临时文件。题
因此,我知道这里可能存在一些与OpenCV相关的事情;例如,也许是因为UMat类型正在进行一些时髦的转换。
我要在运行时方面寻求最有效的解决方案。另外,我不希望这个问题仅限于OpenCV案例;获得使用
std::move(input)
调用的任何类型的函数的答案,将不胜感激。 最佳答案
我认为您在函数的输入参数中缺少了const
。尝试如下:
UMat addUMats(const UMat & M1, const UMat & M2) {
UMat returnMat;
add(M1, M2, returnMat);
return move(returnMat);
}
可能不是唯一的问题,但就目前而言,您的函数不能将临时变量作为输入,因为它假定可以在函数内部对其进行修改。