【问题标题】:C Wrapper for Mat::at - error: invalid initialization of non-const reference of typeMat::at 的 C 包装器 - 错误:类型的非常量引用的初始化无效
【发布时间】:2014-03-18 07:14:58
【问题描述】:

我正在为 Mat::at 编写一个 C 包装器,并且正在为所有 <typename> 编写一个包装器。 Vec4s 的这个不会运行,因为我添加了 &。我必须在所有typenames 的typenames 包装器上执行此操作,例如double、float、int 等,这样我就可以使用包装器写入矩阵元素以及读取它。

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

唯一的规定是我必须能够使用 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

【问题讨论】:

    标签: c++ c opencv


    【解决方案1】:

    只需按值返回一个指针:

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

    如果您按照您所说的编写 C 包装器,则无论如何都不能通过引用返回。


    仅供参考,第一个错误是因为您无法将非常量引用绑定到临时对象(在您的情况下,临时对象是获取self-&gt;at&lt;Vec4s&gt;(i, j); 地址的结果)。

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2013-10-11
      • 1970-01-01
      • 2015-01-26
      • 2023-04-04
      • 2013-01-07
      • 2012-01-07
      • 2021-10-26
      相关资源
      最近更新 更多