我正在为Mat::at编写一个C包装器,我正在为所有<typename>
's编写一个。Vec4s
的这个不会运行,因为我加了&我必须在typenames
的所有Mat::at
C包装上这样做,如double
, float
, int
等,所以我可以使用包装器来写入矩阵元素以及读取它。
在尝试添加&对于下面的包装器,我得到了包装器下面的第一个错误。我又加了一个&;在第一个&在下面的包装器旁边的函数名称,并得到包装器下面的第二个错误…我想为什么是c++11的事情,为什么我的编译器不会接受第二个&,所以我在我的编译器参数(ubuntu信任的g++)中添加了-std=c++11,并得到了第三个错误消息…
唯一的规定是我必须能够用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);
第二个错误:no -std=c++11
error: expected unqualified-id before ‘&&’ token
第三个错误-添加-std=c++11
warning: returning reference to temporary
按值返回指针:
Vec4s* cv_Mat_at_Vec4s1(Mat* self, int i, int j) {
return &self->at<Vec4s>(i, j);
}
如果你像你说的那样写一个C包装器,你无论如何都不能通过引用返回。
供参考,第一个错误是因为您不能将非const引用绑定到临时对象(在您的情况下,临时对象是获取self->at<Vec4s>(i, j);
地址的结果)。
第二个错误是因为,你猜到了,右值引用是c++ 11的特性。
第三个错误是因为您返回了对函数返回后超出作用域的临时对象的引用。右值引用仍然只是引用,它们不会神奇地延长对象的生命周期。