Ошибка C2719: '_Val': формальный параметр с __declspec (align ('16 ')) не будет выровнен?

Я пытаюсь создать вектор для D3DXMATRIXA16 следующим образом: vector<D3DXMATRIXA16> matrices; и получаю ошибку:

     d:\Program Files\Microsoft Visual Studio 9.0\VC\include\vector(717) :

ошибка C2719: '_Val': формальный параметр с __declspec (align ('16 ')) не будет выровнены

    e:\projects\emuntitled\em\emscratch\emshadow.h(60) :

: см. ссылку на шаблон шаблона экземпляр 'std::vector < _Ty > ' скомпилированный         с         [             _Ty = D3DXMATRIXA16         ]

Почему это точно?

Спасибо за любую помощь!

Ответы

Ответ 1

Это известная проблема, что stl:: vector не может содержать правильно выровненные данные, например D3DXMATRIXA16. Один плакат приколол основную причину (или, по крайней мере, один из них?): Объявление vector:: resize передает выровненные данные по значению, а не как константная ссылка. В этой теме было предложено несколько обходных решений, причем самый безопасный из них - stl:: vector. Вы также можете сами исправить заголовки stl и перекомпилировать - на самом деле это может быть проще, чем кажется, но я не сделал этого сам.

EDIT: ссылки теперь сломаны (спасибо @David Menard), здесь альтернативный, более сложный ответ.

Проблема устранена в VS2012RC - здесь ссылка на на соответствующую проблему со связью. Оказывается, это была проблема в самом стандарте С++, исправленная в 2008 году.

Ответ 2

Похоже, класс std::vector требует, чтобы параметр шаблона был выровнен (1); вероятно, для какой-то быстрой индексации.