完整模板专精化错误

时间:2017-04-02 06:45:28

标签: c++ visual-studio-2015 template-specialization

由于我正在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;”)。我很确定我正确地遵循了专业化文档,但我很容易出错。

1 个答案:

答案 0 :(得分:1)

看起来问题是由结构关键字之前写的__declspec引起的,因此无法正确识别模板。尝试更改为

template<> struct __declspec(align(16)) TVec2<s64>

使用alignas specifier并摆脱无名的struct / union也可能是个好主意。