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++模板的規則,*運算符的聲明算作函數模板的部分特化,並且是非法的。
我在這裏錯過了什麼?
請添加您用於成功構建程序的其餘代碼。 –