0

我正在寫簡單的類來實現向量和矩陣,作爲嘗試學習OpenGL的一部分。我有一個看起來像這樣的矩陣和向量類:爲什麼模板好友功能的這種部分專業化工作?

// Forward declarations 
template <typename T, size_t N/*len*/> struct vec; 
template<typename T, size_t N /*rows*/, size_t M /*cols*/> struct mat; 

// Forward declare *operator for matrix 
// (NxM) matrix multiplied by (MxP) matrix yields (NxP) matrix 
mat<T, N, P> operator* (const mat<T, N, M>& A, const mat<T, M, P>& B); 

template <typename T, size_t N> 
struct vec { 
    public: 
     vec() {} 
     virtual ~vec() {} 
    private: 
     T[N] m_data; 
}; 

template <typename T, size_t N, size_t M> 
struct mat { 
    public: 
     mat() {} 
     virtual ~mat() {} 
     // This is where it gets interesting. By my reading of the rules 
     // of C++11, this counts as a partial specialization of the 
     // operator template, and should not work. 
     // However, it compiles just fine! 
     template <size_t n, size_t m, size_t p> 
     friend mat<T, n, p> operator* (const mat<T, n, m>& A, 
             const mat<T, m, p> &B); 
     // Implementation appears later in the same header file. 
    private: 
     T[N*M] m_data; 
}; 

我宣佈*運營商作爲一個朋友,因爲我希望它可以訪問內部m_data成員,但我不希望「墊的用戶'和'vec'來了解內部。

這編譯和運行得很好。我有一個矩陣乘法的單元測試,它工作得很好。但是,我不知道它爲什麼編譯,更不用說運行。通過閱讀C++模板的規則,*運算符的聲明算作函數模板的部分特化,並且是非法的。

我在這裏錯過了什麼?

+1

請添加您用於成功構建程序的其餘代碼。 –

回答

0

原來這是* NOT *編譯。我認爲這是編譯,因爲我沒有在我的單元測試中調用模板流操作符。

對不起,這個愚蠢的問題!