我得到这个奇怪的错误,这段代码编译(并正确显示三角形):
Point pts[3] = { Point(20, 20), Point(60, 20), Point(40, 40) };
const Point *ptsp = pts;
int npts[1] = {3};
fillPoly(img, &ptsp, npts, 1, Scalar(255, 255, 0));
但如果我将const Point *ptsp = pts;
替换为Point *ptsp = pts
,那么我会收到此错误:
1>C:\Workspace\ImageProcessing\Tutorials\src\main.cpp(16): error C2665: 'cv::fillPoly' : none of the 2 overloads could convert all the argument types
1> C:\Workspace\ImageProcessing\opencv\build\include\opencv2/core/core.hpp(2632): could be 'void cv::fillPoly(cv::Mat &,const cv::Point **,const int *,int,const cv::Scalar &,int,int,cv::Point)'
1> C:\Workspace\ImageProcessing\opencv\build\include\opencv2/core/core.hpp(2637): or 'void cv::fillPoly(cv::InputOutputArray,cv::InputArrayOfArrays,const cv::Scalar &,int,int,cv::Point)'
1> while trying to match the argument list '(cv::Mat, cv::Point **, int [1], int, cv::Scalar_<_Tp>)'
1> with
1> [
1> _Tp=double
1> ]
但通常你应该能够在函数需要const指针的地方传递非常量指针,那么为什么它不能在这里工作呢?
当然,我最初使用过Point *ptsp = pts;
,而且我花了很长时间才弄清楚它需要const
,这对我来说完全出乎意料。< / p>
答案 0 :(得分:1)
这在此解释:http://www.parashift.com/c++-faq-lite/constptrptr-conversion.html
从Foo **→Foo const **转换危险的原因是它会让你在没有强制转换的情况下默默地和不小心地修改const Foo对象: class Foo { 上市: void modify(); //对此对象进行一些修改 };
int main() { const Foo x; Foo* p; Foo const** q = &p; // q now points to p; this is (fortunately!) an error *q = &x; // p now points to x p->modify(); // Ouch: modifies a const Foo!! ... }
如果q =&amp; p线是合法的,q将指向p。下一行* q =&amp; x,将p本身(因为 q为p)改为指向x。那将是一件坏事,因为我们将丢失const限定符:p是Foo 但x是const Foo。 p-&gt; modify()行利用p修改其引用的能力,这是真正的问题,因为我们最终修改了一个const Foo。