在函数中通过引用调用双端队列的修饰符会产生 MinGW64 编译错误

Calling modifiers of a deque by reference in a function produce MinGW64 compile errors

我正在通过引用传递变量 std::deque<cv::Point[4]> pastpolygons。我还通过引用同一函数来传递 C 数组 cv::Point polygon[4]。目的是一个函数可以根据需要将数组 push/pop 放入数组的 deque 中。我已经按照我认为它应该工作的方式编写了代码(还有其他方法可以编写代码吗?)并且编译错误非常冗长且难以理解(有好几页)。

代码如下:

void AveragePolygon ( cv::Point (*polygon)[4], std::deque<cv::Point[4]> *pastpolygons, int samplestokeep )
{
    //FIFO
    pastpolygons->push_back( *polygon );   //comment and compiles fine
    if ( pastpolygons->size() > samplestokeep ) {
        pastpolygons->pop_front();         //comment and compiles fine
    }
    return;
}

参数和参数语法特别棘手,但只要我不尝试调用 pastpolygons 的修饰符,它就会编译。我也尝试过 (*pastpolygons).push_back/pop_front ,但无济于事。有什么想法吗?

另外,编译错误的第一位:

C:/MinGW64/x86_64-w64-mingw32/include/c++/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = cv::Point_<int> [4]; _Args = {const cv::Point_<int> (&)[4]}; _Tp = cv::Point_<int> [4]]': C:/MinGW64/x86_64-w64-mingw32/include/c++/bits/alloc_traits.h:256:4:   required from 'static std::_Require<typename std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::type> std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = cv::Point_<int> [4]; _Args = {const cv::Point_<int> (&)[4]}; _Alloc = std::allocator<cv::Point_<int> [4]>; std::_Require<typename s

嗯,我觉得有必要说一下
当你使用 C++ 时,尤其是现在的 c++11
你可以忘掉指针,使用
来摇滚它 高级编程! (超级高效!
这就是 C++ 的魅力)。

为了我们的忙碌,我将多边形定义为:

typedef vector<cv::Point> Polygon;

然后是剩下的:

void AveragePolygons(Polygon polygon, deque<Polygon> &pastpolygons)
{
    pastpolygons.push_back(polygon);   //comment and compiles fine
    if (pastpolygons.size() > samplestokeep ) {
        pastpolygons.pop_front();         //comment and compiles fine
    }
}

像这样工作时,
我相信你遇到的问题都会消失,
因为其中很多都与指针、浅拷贝等有关。

还有一个东西,
如果你想确保一个多边形只包含 4 个点
您可以从 vector 派生它并提供适当的
构造函数或其他成员函数来确保这一点。

例如下面的 obsessively-c++11 代码
定义一个构造函数,它需要 4 个点:

struct Polygon : public vector<cv::Point> {
    Polygon(cv::Point p1, cv::Point p2, cv::Point p3, cv::Point p4) :
        vector<cv::Point>{p1, p2, p3, p4}  
    {}
};