gpt4 book ai didi

c++ - 为什么这是有效的? (具有不同参数的模板类的模板友元函数)

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:37 26 4
gpt4 key购买 nike

我有一个矩阵类:

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();

它就是这样工作的。这到底是如何以及为什么起作用的? overloadad 运算符需要一个额外的模板参数,而类只需要 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< 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++ - 为什么这是有效的? (具有不同参数的模板类的模板友元函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com