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&lt;cv::Point3_&lt;int&gt;&gt;'


完整的错误信息:

/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_&lt;int&gt; 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 classSince I'm inheriting from cv::ParallelLoopBody, it is defined as const 你的意思一定是它的方法是const,因为基类不能在继承过程中'制造'const。它的 membersmethods 要么是const,要么不是const,并且派生类完全按原样继承这些资格。【参考方案2】:

您不能将其更改为 emplace_back 并删除 cv::Point3_&lt;int&gt; 吗?

【讨论】:

虽然它没有回答上述问题,但这确实回答了一个更好的问题:使用构造函数参数将对象添加到容器的最佳方法是什么。 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 导致潜在的内存泄漏

如何使用 OpenCV(在 C++ 中)将齐次点转换为非齐次点

opencv 轮廓点的坐标大小的修改