gpt4 book ai didi

c++ - 如何使用模板修复 'no match for ‘operator*’(操作数类型为 ‘Matrix’ 和 ‘Matrix’)'

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:44 27 4
gpt4 key购买 nike

我正在尝试在 C++17 中实现基于模板的 Matrix 类。该类应该覆盖 operator*() 以允许诸如

Matrix<double, 2, 3> a = {{{3,2,1},{1,0,2}}};
Matrix<double, 3, 2> b = {{{1,2},{0,1},{4,0}}};
Matrix c = a * b;

但这会导致编译器错误。

no match for ‘operator*’ (operand types are ‘Matrix<double, 2, 3>’ and ‘Matrix<double, 3, 2>’)
43 | Matrix c = a * b;
| ~ ^ ~
| | |
| | Matrix<[...],3,2>
| Matrix<[...],2,3>

原则上我知道 Matrix a 和 b 是完全不同的类型,但我认为这应该是可能的,因为第二个和第三个模板参数都是 size_t 类型。

template <typename T, size_t nbRows, size_t nbColumns>
class Matrix {
public:
Matrix(std::vector<std::vector<T>> &&vector) {
assert(vector.size() == nbRows);
assert(vector.front().size() == nbColumns);

auto matrixIter = matrix.begin();
for(auto && row : vector) {
std::copy_n(std::make_move_iterator(row.begin()), nbColumns, matrixIter);
std::advance(matrixIter, nbColumns);
}
}

friend inline Matrix operator*(Matrix lhs, const Matrix &rhs) {
// Compute the product of lhs and rhs
return lhs;
}

private:
std::array<T, nbRows * nbColumns> matrix;
};

最佳答案

你的 operator*适用于 Matrix<A, B>Matrix<A, B> (相同类型)但不是 Matrix<A, B>Matrix<B, A> (不同种类)。不要在类模板中定义运算符,而是像这样在类模板之外将其作为自由函数来实现:

template<typename T, size_t LhsRows, size_t LhsColumns, size_t RhsRows, size_t RhsColumns>
auto operator*(const Matrix<T, LhsRows, LhsColumns>& lhs, const Matrix<T, RhsRows, RhsColumns>& rhs)
{
static_assert(LhsColumns == RhsRows, "unrelated matrix sizes");

// ...
}

通过这种方式,您可以将运算符应用于 Matrix 的两个不同实例。类模板。

关于c++ - 如何使用模板修复 'no match for ‘operator*’(操作数类型为 ‘Matrix<double, 2, 3>’ 和 ‘Matrix<double, 3, 2>’)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57501025/

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