【发布时间】:2014-07-22 02:44:45
【问题描述】:
我有一个矩阵类:
template <typename T, const int N, const int M>
class TMatrixNxM
{
(...)
friend TMatrixNxM operator*(const TMatrixNxM&, const TMatrixNxM&);
(...)
}
现在,在数学中,将 NxM 矩阵与 MxP 矩阵相乘会返回 NxP 矩阵。因此,我需要一个返回 NxP 矩阵的运算符,并将 NxM 和 MxP 矩阵作为参数,如下所示:
template <typename T, const int N, const int M, const int P>
TMatrixNxM<T, N, P> operator*(const TMatrixNxM<T, N, M> &par_value1, const TMatrixNxM<T, M, P> &par_value2)
{
TMatrixNxM<T, N, P> result;
(...) //Calculate
return result;
}
当我测试它时:
TMatrixNxM<float, 2, 3> m1;
(...) //Set the values
TMatrixNxM<float, 3, 4> m2;
(...) //Set the values
TMatrixNxM<float, 2, 4> m3 = m1 * m2;
m1.print(); //Matrix class has a print function for testing
printf("\n");
m2.print();
printf("\n");
m3.print();
它就是这样工作的。这究竟是如何以及为什么起作用的?重载运算符需要一个额外的模板参数,而类只需要 3 个,并且在声明中我没有指定任何内容。但是,如果我这样声明:
template <typename T, const int N, const int M>
class TMatrixNxM
{
(...)
template<typename T, const int N, const int M, const int P> friend TMatrixNxM<N, P> operator*(const TMatrixNxM<N, M>&, const TMatrixNxM<M, P>&);
(...)
}
然后编译器抱怨模板参数太少。我希望我不会在这里遗漏一些明显的东西。
谢谢!
编辑
我现在看到“争论太少”的抱怨是针对我没有包括 T 的事实。应该是 TMatrixNxM 等
【问题讨论】:
-
您的问题是编译器如何知道
template<typename T> void foo(T); foo(42);之类的模板参数? -
将非类型模板参数声明为
const对我来说没有多大意义。无论如何它是不可变的。 -
当然
TMatrixNxM<N, P>的模板参数太少了。 -
是的,我明白了,事实证明我确实错过了一些明显的东西。你也是对的,dyp,我想我是不假思索地自动做到的,但这并不重要。