我正在为Mat :: at编写一个C包装器,并且我正在为所有<typename>
做一个。 Vec4s
的这个因为我添加了&amp ;.我必须在我Mat::at
的所有typenames
C包装器上执行此操作,例如double
,float
,int
等,以便我可以使用包装器写入矩阵元素以及阅读它。
尝试添加&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
答案 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参考仍然只是参考,它们不会神奇地延长对象的生命周期。