我想用C ++编写一个函数,它将矩阵作为可选参数。如果用户在调用函数时最终传递矩阵,则函数将对其进行修改,因此我将通过引用实现传递。
根据接受的previous question答案,可以通过将默认值设为空Mat来完成,例如:
void foo(..., cv::Mat &matrix = cv::Mat()) {
// code
return;
}
然而,当我尝试在OpenCV 3.2中编译它时,我从'cv :: Mat'类型的rvalue中得到了«cv :: Mat&amp;'类型的非const引用的无效初始化。< / p>
自OpenCV 2.4以来,此功能是否已更改,或问题是否可能在其他地方?
答案 0 :(得分:5)
我可能错了,因为我是这些事情的初学者,但这就是我的想法。
你想通过ref传递一个可选参数。问题是带有符号&amp;是对l值的引用,l值是存在的对象。 C ++不允许你写的东西,因为matrix
是一个r值,它是一个没有与之关联的实际内存地址的临时对象。
你可以传递cv::Mat &matrix = cv::Mat()
的唯一方法就是修改const cv::Mat &matrix = cv::Mat()
,这当然不是你需要的。
最简单的解决方案IMHO只是重载你的函数定义,以便你有
void foo(...args);
void foo(...args, cv::Mat &matrix);
希望有所帮助
答案 1 :(得分:1)
这是因为C ++不允许用rvalue初始化非const引用。
所以你可以:
1)使参考const - 不适合你,因为你想改变函数中矩阵的内容
或
2)在您的模块中全局存储cv::Mat
init变量:
static const cv::Mat g_mat = cv::Mat();
void foo(..., cv::Mat &matrix = g_mat) {