2016-08-25 3 views
0

変数std::deque<cv::Point[4]> pastpolygonsを参照渡しします。私はまた、C配列cv::Point polygon[4]を同じ関数を参照して渡しています。 1つの機能が必要に応じて配列のdequeに配列をプッシュ/ポップすることが意図されています。私はコードを書いたことがあると思います(コードを書くための他の方法はありますか?)、コンパイルエラーは非常に冗長で分かりにくいです(数ページです)。参照でdequeの修飾子を関数で呼び出すと、MinGW64コンパイルエラーが発生する

は、ここでは、コードです:

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 
+0

「私は変数を渡すよ "スタンダード::両端キューpastpolygons":例えば

、以下執拗-C++コード11
4点を取るコンストラクタを定義します。 " - いいえ、違います。 – SergeyA

+0

配列を標準コンテナに格納することはできません。 'std :: vector'や' std :: array'を使うことができます。そしてそれらは参考文献ではなく、指針です。 – molbdnilo

答えて

0

まあ、私はあなたが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からそれを導出し、これを保証するために、適切な
コンストラクタまたは他のメンバ関数を提供できることを確認したい場合。参照により

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} 
    {} 
}; 
+1

ありがとう、配列を4ポイントに制限することは、std :: vectorよりもCスタイルの配列を使用する私の意図と理由でした。コンストラクタによってベクトルを4ポイントに制限する方法が役に立ちました。 – DrTarr

+1

次にstd :: arrayを使うべきです。 –

+0

それは知りませんでした、ありがとう。あなたは常にここで新しいものを学ぶ... :-) –

関連する問題