Настраиваемое выравнивание не входит в стандарт, поэтому то, как с ним справляются компиляторы, зависит от них - похоже, VC ++ не нравится объединять шаблоны с __declspec.
Я предлагаю обходной путь, используя специализацию, что-то вроде этого:
template<int A> struct aligned;
template<> struct aligned<1> { } __declspec(align(1));
template<> struct aligned<2> { } __declspec(align(2));
template<> struct aligned<4> { } __declspec(align(4));
template<> struct aligned<8> { } __declspec(align(8));
template<> struct aligned<16> { } __declspec(align(16));
template<> struct aligned<32> { } __declspec(align(32));
, а затем производные от этого в вашем коде:
template<int Align>
class MyClass
{
private:
struct MyStruct : aligned<Align> {
// stuff
};
};
Это, к сожалению, нарушает POD-сущность MyStruct. Он также не работает со встроенными / существующими типами, поэтому вам придется использовать оболочку для них.
aligned_t<int, 4> myAlignedVariable;