我正在建立一个通用矩阵类,该矩阵类将最小和最大列和行作为模板参数。定义为
// min_column, max_column, min_row, max_row
template <int minN, int maxN, int minM, int maxM, typename T>
class ZQOffsetMatrix {
它有一个具有签名的矩阵乘法方法
template <int minN, int maxN, int minM1, int maxM1, int minM2, int maxM2, typename T>
inline ZQOffsetMatrix<minM1, maxM1, minM2, maxM2, T> operator*(const ZQOffsetMatrix<minN, maxN, minM2, maxM2, T>& m1, const ZQOffsetMatrix<minM1, maxM1, minN, maxN, T>& m2)
我还有一个测试实例,该实例实例化了我的两个矩阵类:
ZQOffsetMatrix<5, 8, 11, 14, double> A(...), I(...);
// ...
A*I;
但这会导致以下编译错误:
error: no match for ‘operator*’ (operand types are ‘ZQOffsetMatrix<5, 8, 11, 14, double>’ and ‘ZQOffsetMatrix<5, 8, 11, 14, double>’)
A*I;
我在模板中使用6个整数参数来编写它,这是为什么我收到此错误的原因,即编译器无法弄清楚要插入模板名称的每个参数中的4个值中的哪个?
最佳答案
编译器可以很容易地替换模板参数。实际上,发现您使用不正确。遵循operator*
矩阵的规则,两个维数相同的矩阵不可相乘。 (不计算平方矩阵)。这将要求至少一个模板参数同时具有2个不同的值,这是不可能的。
另一方面,将2个合适维度的矩阵相乘,如下所示:
ZQOffsetMatrix<5, 8, 11, 14, double> A{};
ZQOffsetMatrix<11, 14, 5, 8, double> I{};
ZQOffsetMatrix<11, 14, 11, 14, double> Z = A * I;
将满足
operator*
并进行编译。这到底是您想要的,还是合理的,取决于您自己。编译器不会为您解决这个问题。
关于c++ - 模板值比类中定义的更多的运算符没有匹配功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61219222/