ぷろぐ((>ω<))

ぷろぐらみんぐ関係のメモ

pcl::PointCloudやEigenを含むvectorをresizeするとエラーが発生する場合の対処

C++行列演算ライブラリ「Eigen」を含む構造体などのstd::vectorは、下記のページで説明されているような工夫が必要となる。

Eigen: Using STL Containers with Eigen

例えばこんなコードが書ける。

#include <vector>
#include <Eigen/Core>
#include <Eigen/StdVector>

struct Hoge {
  Eigen::Vector4f v;
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};

void main() {
  std::vector<Hoge, Eigen::aligned_allocator<Eigen::Vector4f>> hoges;
  hoges.resize(4);
}

だが、Visual Studio 2010またはそれ以前のバージョンのIDEを使用していると、上記コードではvectorのresizeをすると、コンパイル時に次のようなエラーが発生する。

3>c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector(870): error C2719: '_Val': __declspec(align('16')) の仮引数は配置されません。

そのような場合の対処方法。PCLの Users mailing list ではVSのC++vectorインクルードファイルを次のように修正すればよいと書かれていた。

I solved this issue by changing the signature of resize() funtion from Microsoft Visual Studio 10.0/VC/include/vector like this:

from:
void resize(size_type _Newsize, _Ty _Val)

to:
void resize(size_type _Newsize, _Ty &_Val)

Hope this helps!

http://www.pcl-users.org/point-cloud-h-alignment-issue-td4021525.html

ただ、個人的には編集可能な状態で渡すのは気持ち悪いので下記のように変更した。これでもちゃんと動作する。

void resize(size_type _Newsize, const _Ty &_Val)

ちなみに Visual Studio 2013 のvectorファイルを見てみたが下記のように書かれていたので、上記の問題は起こらないと思う。

void resize(size_type _Newsize, const value_type& _Val)