2017-04-02 84 views
0

由於我SIMD'ifying我的代碼我決定使用模板專門化來處理每個類型的案件,但它似乎我做了錯誤的事情。全模板專業化錯誤

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:unrecognizeable模板聲明/定義)編譯之後(C2059:語法錯誤: 「<末解析>」)。我很確定我正確地遵循了專業化的文檔,但我很容易出錯。

回答

1

看起來問題是由結構關鍵字之前寫入的__declspec引起的,所以模板無法正確識別。嘗試改變,以

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

可能也是一個好主意,用alignas specifier,擺脫無名結構/聯合的。

+0

哇,這是一個簡單的問題,感謝您的發現。 – Jarann