C++ 标准::OpenCV点的向量,无后推方法

C++ 标准::OpenCV点的向量,无后推方法,c++,opencv,c++11,vector,C++,Opencv,C++11,Vector,免责声明:引发此错误的原因是touchesY是从cv::ParallelLoopBody继承的嵌套类的属性,cv::ParallelLoopBody是一个const类,本文中未显示该类。解决方法在答案中有详细说明 我有这个cv::Points3i的std::vector,但每当我尝试推回一个新值时,就会出现一个错误,即没有“推回方法” 在头文件中声明: std::vector<cv::Point3_<int>> touchesY; std::向量触摸; 调用源文件:

免责声明:引发此错误的原因是
touchesY
是从cv::ParallelLoopBody继承的嵌套类的属性,cv::ParallelLoopBody是一个const类,本文中未显示该类。解决方法在答案中有详细说明

我有这个cv::Points3i的std::vector,但每当我尝试推回一个新值时,就会出现一个错误,即没有“推回方法”

在头文件中声明:

std::vector<cv::Point3_<int>> touchesY;
std::向量触摸;
调用源文件:

touchesY.push_back(cv::Point3_<int>(i/mask.step[0],0,i-x));
toucesy.push_back(cv::Point3_(i/mask.step[0],0,i-x));
我已经包含了向量库,这样做没有错误:

std::vector<int> vec;
vec.push_back(1);
std::向量向量向量机;
向量推回(1);
有人能指出我做错了什么吗?谢谢

错误是:没有匹配的成员函数用于调用“push_back”


根据@FirstStep的建议,我将代码分解为:

cv::Point3_<int> temp(i/mask.step[0],0,i-x);
touchesY.push_back(temp);
cv::Point3_uuTemp(i/mask.步骤[0],0,i-x);
触摸。推回(温度);
现在我在第一行得到一个错误,它是:没有匹配的构造函数来初始化
'std::vector'


完整错误消息:

/Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/include/c++/v1/vector:687:36: 候选函数不可行:“此”参数的类型为“const” std::vector>,但方法未标记为常量 /Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/include/c++/v1/vector:685:36: 候选函数不可行:“此”参数的类型为“const” std::vector>,但方法未标记为常量


你就不能把它改成放回原处,然后放下
cv::Point3吗?

我终于找到了错误。正如@NathanOlivier所指出的,这是一个基于上下文的错误

基本上,我定义了一个从cv::ParallelLoopBody继承的嵌套类,它是cv::Point的std::vector类型的属性,名为touchesY。因为我是从cv::ParallelLoopBody继承的,所以它被定义为const,这阻止了我对它调用push_

我通过将属性移动到基类来解决这个问题,然后在创建嵌套类时将引用传递给基类,然后使用该类调用push_


谢谢大家

请复制实际错误。尝试将其分解。如果这样写会发生什么:
cv::Point3_uutemp(i/mas.step[0],0,i-x);触摸。推回(温度)哪部分弹出错误?对不起,我应该提供此信息。现在添加!谢谢如果这是整个编译器错误消息,那么您需要一个新的编译器。如果不是,请发布完整的错误消息。您的错误消息提到了
。您似乎在类成员函数中添加了此项。如果是这种情况,我们需要看到,正如它所显示的那样,您处于
const
成员函数中。请做一个测试,并确保您给我们的错误是正确的错误输出,尽管它没有回答前面提到的问题,但这确实回答了一个更好的问题:使用构造函数参数向容器添加对象的最佳方法是什么
emplace_-back
是一种方法,它确保我们避免了
push_-back
可能(或者可能?除非复制省略)需要的不必要的复制构造。不过,您也需要删除内括号。我使用
emplace\u back
得到了相同的错误。但是使用
后置
会比使用
后置
更好吗?谢谢我只是希望你试图推回的类型是错误的,通过更改为emplace,你会得到正确的构造函数或不同的错误。但是没有。我通常更喜欢使用“后置”而不是“后置”。@Cedric是的,通过允许就地构造,
emplace\u-back()
通常比
push\u-back()
更有效,而且效率永远不会低于,
push\u-back()
,后者需要一个已经构造好的元素进行复制(尽管存在潜在的复制省略)。因此,
emplace\u back()
是一个更好的默认值。你可以在这方面找到很多很好的讨论。
我继承自cv::ParallelLoopBody,这是一个常量类
,因为我继承自cv::ParallelLoopBody,它被定义为常量
,你一定是说它的方法是
常量
,因为基类在继承过程中不能“生成”
const
。它的成员或方法要么是
const
,要么不是,并且派生类完全按照原样继承这些限定条件。