为什么这是有效的?(模板友元函数和带有不同参数的模板类)
Why is this working? (template friend function with template class with different arguments)
我有一个矩阵类:
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也包括在内的事实。应该是tmatrixx &;T, N, P>等
两件事:
1)编译器理解类的模板实参和函数的模板实参之间的区别。一个类可以有3个模板参数,一个函数可以有4个模板参数。
所以当你声明:
template <typename T, const int N, const int M, const int P>
TMatrixNxM<T, N, P> operator*(const TMatrixNxM<T, N, M> &par_value1, constXX TMatrixNxM<T, M, P> &par_value2)
你定义了一个接受4个模板参数的函数。然后,当编译器看到
TMatrixNxM<float, 2, 4> m3 = m1 * m2;
编译器推导出4个模板实参:T, N, M, p。它推导出T = float, N = 2, M = 4, p =来自par_value2的第三个模板实参。
还要注意,函数的模板实参名不必与类中的模板实参名相同:
template <typename FOO, const int BAR, const int BAZ, const int QUX>
TMatrixNxM<FOO, BAR, QUX> operator*(const TMatrixNxM<FOO, BAR, BAZ> &par_value1, const TMatrixNxM<FOO, BAR, QUX> &par_value2)
2)在第二个示例中,您确实缺少一个模板参数。您正在尝试返回TMatrixNxM,但TMatrixNxM需要3个参数。如果您将返回类型更改为TMatrixNxM,它看起来会起作用……这就是你在第一部分所做的
相关文章:
- 与参数匹配的友元模板函数实例化
- 以嵌套类为参数的友元模板声明
- 如何将模板友元函数声明为可变参数类
- 当类和函数具有单独的模板参数时,在类定义之外定义友元函数
- 友元类不工作 C++ 、'class T'阴影模板参数的声明
- 接受类参数的友元函数的尾随返回类型
- C++用参数重载友元类函数参数
- 如何将可变参数模板函数声明为友元
- 友元方法参数列表中的不同模板专用化
- 友元函数是否必须将常量对象作为其参数
- 指向友元函数中基类参数类型的指针
- 模板化结构的友元函数,其参数类型取决于结构的内部
- c++友元类作为ctor的参数
- 引入新模板参数的模板类的模板友元函数
- 类内声明的友元运算符中左手参数的隐式转换
- 具有默认模板参数的友元函数模板
- 将模板参数作为模板类的友元
- 如何在分离声明和定义时为友元函数提供默认参数
- 在参数中接受 2 个类的友元函数 - 未定义'Class'
- 使用模板参数友元从类继承