c++ - 模板值比类中定义的更多的运算符没有匹配功能

标签 c++

我正在建立一个通用矩阵类,该矩阵类将最小和最大列和行作为模板参数。定义为

// 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/

相关文章:

c++ - SetWindowsHookEx 注入(inject)失败

c++ - std::packaged_task 没有违反销毁 promise ?

c++ - 为什么有些方法属于主题/观察者接口(interface),而另一些方法属于主题/观察者具体子类?

c++ - 将 vector<unique_ptr<T>> 转换为 vector<unique_ptr<const T>>

C++ Powerball - 文件拆分和错误(游戏类型)

c++ - C/C++ 帮助在 C 中处理多个文件

c++ - 获取 std::fstream 失败错误消息和/或异常

c++ - C++ 中的被动对象

C++ : Why redeclare a template's generic data type after one use?

c++ - 使用黑名单边缘提升过滤图