std::vector of OpenCV 点,没有 push_back 方法
Posted
技术标签:
【中文标题】std::vector of OpenCV 点,没有 push_back 方法【英文标题】:std::vector of OpenCV points, no push_back method 【发布时间】:2016-07-15 13:50:49 【问题描述】:免责声明:引发错误是因为touchesY
是从 cv::ParallelLoopBody 继承的嵌套类的属性,该类是 const 类,本文未显示。解决方法在答案中有详细说明。
我有这个 cv::Points3i 的 std::vector,但每当我尝试 push_back 一个新值时都会出错,即没有“push_back 方法”。
在头文件中声明:
std::vector<cv::Point3_<int>> touchesY;
在源文件中调用:
touchesY.push_back(cv::Point3_<int>(i/mask.step[0],0,i-x));
我已经包含了矢量库,这样做没有错误:
std::vector<int> vec;
vec.push_back(1);
有人能指出我做错了什么吗?谢谢!
错误是:没有匹配的成员函数调用“push_back”。
按照@FirstStep 的建议,我将代码分解为:
cv::Point3_<int> temp(i/mask.step[0],0,i-x);
touchesY.push_back(temp);
我现在在第一行得到一个错误,说:没有匹配的构造函数用于初始化'std::vector<cv::Point3_<int>>'
。
完整的错误信息:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:687:36: 候选函数不可行:“this”参数的类型为“const” std::vector >',但方法未标记为 const /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:685:36: 候选函数不可行:“this”参数的类型为“const” std::vector >',但方法未标记为 const
【问题讨论】:
请复制实际错误。 尝试分解它。如果你这样写会发生什么:cv::Point3_<int> temp(i/mas.step[0],0,i-x); touchesY.push_back(temp);
哪个部分会弹出错误?
对不起,我应该提供这些信息。现在添加了!谢谢!
如果这是整个编译器错误消息,那么您需要一个新的编译器。如果不是,请发布完整的错误消息。
您的错误消息提到了this
。看来您是在类成员函数中使用它。如果是这种情况,我们需要看到您在const
成员函数中。请创建一个minimal reproducible example 并确保您给我们的错误是来自minimal reproducible example 的确切错误输出
【参考方案1】:
我终于找到了错误。正如@NathanOlivier 所指出的,这是一个基于上下文的错误。
基本上,我定义了一个从 cv::ParallelLoopBody 继承的嵌套类,它作为 cv::Point 的 std::vector 类型的属性,名为 touchesY。由于我是从 cv::ParallelLoopBody 继承的,所以它被定义为 const,这使我无法在其上调用 push_back。
我通过将属性移动到基类来解决这个问题,然后我在创建嵌套类时传递一个引用,然后我用它来调用它的 push_back。
非常感谢大家!
【讨论】:
I inherit from cv::ParallelLoopBody, which is a const class
和Since I'm inheriting from cv::ParallelLoopBody, it is defined as const
你的意思一定是它的方法是const
,因为基类不能在继承过程中'制造'const
。它的 members 或 methods 要么是const
,要么不是const
,并且派生类完全按原样继承这些资格。【参考方案2】:
您不能将其更改为 emplace_back 并删除 cv::Point3_<int>
吗?
【讨论】:
虽然它没有回答上述问题,但这确实回答了一个更好的问题:使用构造函数参数将对象添加到容器的最佳方法是什么。emplace_back
是 方式,并确保我们避免push_back
将(或可能?除非复制省略)在此处需要的不必要的复制构造。不过,您也需要去掉内括号。
我在使用emplace_back
时遇到了同样的错误。但是使用 emplace_back
会比使用 push_back
更好吗?谢谢!
我只是希望他们键入的你试图 push_back 是错误的,并且通过更改为 emplace 你会得到正确的构造函数或不同的错误。但是没有。我通常更喜欢 emplace back 来推回。
@Cedric 是的,通过允许就地构建,emplace_back()
通常比push_back()
更有效,而且效率永远不会低于push_back()
,它需要一个已经-要复制的构造元素(尽管可能存在复制省略)。因此,emplace_back()
是一个更可取的默认值。你可以在 SO 上找到很多关于这个的很好的讨论。以上是关于std::vector of OpenCV 点,没有 push_back 方法的主要内容,如果未能解决你的问题,请参考以下文章
传递 opencv inputarray 并将其用作 std::vector
将 OpenCv Mat 插入 C++ std::vector
查找 std::vector.at() 抛出 std::out_of_range 的位置
OpenCV cv::Mat 使用 std::vector 导致潜在的内存泄漏