続・Alignment

この前の続き。隣のプログラマが原因と解決策を突き止めた。


これは、"__declspec"というキーワードの仕様と、STLのコンテナ類のテンプレートパラメータをインスタンス化する時に起きるVCコンパイラの仕様が悲しいほど残念である事から生じる問題であった模様。

VCのvectorのresizeメソッドの定義は、

template<class _Ty, class _Ax>
class vector
{
  void resize(size_type _Newsize, _Ty _Val)
  {
    ...
  }
}

となっている。

問題なのは、メソッドresizeの第二引数に、_Ty型を値渡ししている事。ここで__declspec((align(#)))が指定されているstruct, class等の型をテンプレートパラメータとして渡すと、VCの仕様に反して、resizeの第二引数に__declspecが指定されてしまうために、C2719のエラーが発生します。


で、回避方法。VCのvectorを書き換える。

template<class _Ty, class _Ax>
class vector
{
  void resize(size_type _Newsize, const_Ty& _Val)
  {
    ...
  }
}

これで解決。いやーよかったよかった。あはははは。


ちなみに、MinGWのGCC3.4.4のvectorのresizeメソッドの第二引数はconst参照で渡されていましたよ。ま、__declspec自体がほぼVCだけの問題(本当はBuilderもですけどね)なので、VCが残念、という事で落ち着きましょう。