gpt4 book ai didi

c++ - Mat::at 的 C 包装器 - 错误:类型的非常量引用的初始化无效

转载 作者:太空宇宙 更新时间:2023-11-04 08:43:47 34 4
gpt4 key购买 nike

我正在为 Mat::at 写一个 C 包装器,我正在为所有 <typename> 做一个的。这一个为 Vec4s不会运行,因为我添加了 &。我必须在所有 Mat::at 上这样做typenames 的 C 包装器喜欢double , float , int等所以我可以使用包装器写入矩阵元素以及读取它。

在尝试将 & 添加到下面的包装器时,我在包装器下方遇到了第一个错误。我在函数名称旁边的下面的包装器中的第一个 & 旁边添加了第二个 &,并在包装​​器下方得到了第二个错误...我想为什么是 c++11 的东西,为什么我的编译器不接受第二 &,所以我将 -std=c++11 添加到我的编译器参数(在 ubuntu trusty 上为 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

最佳答案

只是按值返回一个指针:

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

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


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

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

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

关于c++ - Mat::at 的 C 包装器 - 错误:类型的非常量引用的初始化无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22472621/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com