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 *编译。我认为这是编译,因为我没有在我的单元测试中调用模板流操作符。

对不起,这个愚蠢的问题!