由于我正在SIMD'ify我的代码我决定使用模板专业化来处理每种类型的情况,但似乎我做错了。
template<typename T> struct __declspec(align(16)) TVec2
{
};
template<> __declspec(align(16)) struct TVec2<s64>
{
union
{
struct
{
s64 x, y;
};
struct
{
__m128i v;
};
};
TVec2()
{
v = _mm_setzero_si128();
}
TVec2(s64 scalar)
{
v = _mm_set_epi64x(scalar, scalar);
}
TVec2(s64 x, s64 y)
{
v = _mm_set_epi64x(x, y);
}
template<typename U> operator TVec2<U>() const
{
return TVec2<U>(static_cast<U>(x), static_cast<U>(y));
}
s64& operator[](word index)
{
return v.m128i_i64[index];
}
const s64& operator[](word index) const
{
return v.m128i_i64[index];
}
};
// There are other specializations but they produce the same errors
当我在Visual Studio(2015)中编译时,我得到(C2988:无法识别的模板声明/定义),然后是(C2059:语法错误:“&lt; end Parse&gt;”)。我很确定我正确地遵循了专业化文档,但我很容易出错。
答案 0 :(得分:1)
看起来问题是由结构关键字之前写的__declspec引起的,因此无法正确识别模板。尝试更改为
template<> struct __declspec(align(16)) TVec2<s64>
使用alignas specifier并摆脱无名的struct / union也可能是个好主意。