我正在编写实现向量和矩阵的简单类,作为尝试学习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
成员,但我不希望用户使用&#39; mat&#39;和&#39; vec&#39;了解内部。
这编译并运行得很好。我有一个矩阵乘法的单元测试,它工作得很好。但是,我不知道为什么它甚至编译,更不用说运行了。通过阅读C ++模板的规则,*运算符的声明被视为函数模板的部分特化,并且是非法的。
我在这里缺少什么?
答案 0 :(得分:0)
原来这是 * NOT * 编译。我以为它是编译的,因为当我以为我是在单元测试时没有调用模板流操作符。
抱歉这个愚蠢的问题!