用于Mat :: at - 错误的C包装器:类型的非const引用的无效初始化

时间:2014-03-18 07:14:59

标签: c++ c opencv

我正在为Mat :: at编写一个C包装器,并且我正在为所有<typename>做一个。 Vec4s的这个因为我添加了&amp ;.我必须在我Mat::at的所有typenames C包装器上执行此操作,例如doublefloatint等,以便我可以使用包装器写入矩阵元素以及阅读它。

尝试添加&amp;到下面的包装器我得到了包装器下面的第一个错误。我添加了第二个&amp;在第一个&amp;旁边在函数名称旁边的下面的包装器中,在包装器下面得到了第二个错误...我想为什么是c ++ 11的东西,为什么我的编译器不接受第二个&amp ;,所以我添加了-std = c ++ 11到我的编译器参数(在ubuntu trusty上的g ++)并得到第3条错误消息......

唯一的规定是我必须能够使用Mat:at包装器写入矩阵元素...非常感谢任何帮助。

Vec4s* &cv_Mat_at_Vec4s1(Mat* self, int i, int j) {
  return &self->at<Vec4s>(i, j);
}

第一个错误 - 原始

 error: invalid initialization of non-const reference of type 
 ‘cv::Vec4s*& {aka cv::Vec<short int, 4>*&}’ from an rvalue of type 
 ‘cv::Vec<short int, 4>*’
 return &self->at<Vec4s>(i, j);

第二个错误:没有-std=c++11

 error: expected unqualified-id before ‘&&’ token

第三个错误 - 添加了-std=c++11

 warning: returning reference to temporary

1 个答案:

答案 0 :(得分:2)

只需按值返回指针:

Vec4s* cv_Mat_at_Vec4s1(Mat* self, int i, int j) {
  return &self->at<Vec4s>(i, j);
}

如果你正如你所说的那样写一个C包装器,你无论如何都不能通过引用返回。


仅供参考,第一个错误是因为您无法将非const引用绑定到临时值(在您的情况下,临时值是取self->at<Vec4s>(i, j);地址的结果。)

第二个错误是因为,你猜对了,rvalue引用是C ++ 11的特性。

第三个错误是因为您在函数返回后返回对范围超出范围的临时引用。 Rvalue参考仍然只是参考,它们不会神奇地延长对象的生命周期。