【发布时间】:2021-07-26 11:42:56
【问题描述】:
我有一个这样的矩阵类:
template <class Type, size_t x_dim, size_t y_dim>
class mat {
private:
std::array<Type, x_dim * y_dim> m_data;
size_t xdim = x_dim, ydim = y_dim; // xdim=no of cols ydim= no of rows
public:
// normal constructor to make unit matrix
mat() {
for (int i = 0; i < y_dim; i++)
for (size_t j = 0; j < x_dim; j++)
operator()(i, j) = i == j ? 1 : 0;
}
//constructor to take in array
mat(const std::array<Type, x_dim * y_dim> &in) {
assert(in.size() == x_dim * y_dim);
m_data = in;
}
// () overload to access elements of matrix
Type &operator()(const size_t &r, const size_t &c){
assert(r >= 0 && r < y_dim && c >= 0 && c < x_dim);
return m_data[r * xdim + c];
}
// * overload to multiply two matrices
template <size_t lx, size_t ly>
mat<Type, x_dim, ly> operator*(const mat<Type, lx, ly> &in) const {
assert(x_dim == ly);
mat<Type, x_dim, ly> ret;
int i, j, k;
for (i = 0; i < y_dim; i++) {
for (j = 0; j < lx; j++) {
ret(i, j) = 0;
for (k = 0; k < x_dim; k++)
ret(i, j) += operator()(i, k) * in(k, j);
}
}
return ret;
}
#ifdef _MSC_VER
template <>
mat<Type, xdim, 4> operator*<4,4>(const mat<Type, 4, 4> &in) const;
#endif
};
我如何将 operator* 函数专门用于任何 mat<Type,4,4> 以删除 for 循环。我尝试在上面定义的类之外编写以下代码:
template <class Type, size_t x_dim, size_t y_dim>
template <size_t lx, size_t ly>
mat<Type, 4, 4> mat<Type, 4, 4>::operator*<4, 4>(const mat<Type, 4, 4> &in) const {
return mat<Type, 4, 4>({
operator()(0, 0) * in(0, 0) + operator()(0, 1) * in(1, 0) + operator()(0, 2) * in(2, 0) + operator()(0, 3) * in(3, 0),
operator()(0, 0) * in(0, 1) + operator()(0, 1) * in(1, 1) + operator()(0, 2) * in(2, 1) + operator()(0, 3) * in(3, 1),
operator()(0, 0) * in(0, 2) + operator()(0, 1) * in(1, 2) + operator()(0, 2) * in(2, 2) + operator()(0, 3) * in(3, 2),
operator()(0, 0) * in(0, 3) + operator()(0, 1) * in(1, 3) + operator()(0, 2) * in(2, 3) + operator()(0, 3) * in(3, 3),
operator()(1, 0) * in(0, 0) + operator()(1, 1) * in(1, 0) + operator()(1, 2) * in(2, 0) + operator()(1, 3) * in(3, 0),
operator()(1, 0) * in(0, 1) + operator()(1, 1) * in(1, 1) + operator()(1, 2) * in(2, 1) + operator()(1, 3) * in(3, 1),
operator()(1, 0) * in(0, 2) + operator()(1, 1) * in(1, 2) + operator()(1, 2) * in(2, 2) + operator()(1, 3) * in(3, 2),
operator()(1, 0) * in(0, 3) + operator()(1, 1) * in(1, 3) + operator()(1, 2) * in(2, 3) + operator()(1, 3) * in(3, 3),
operator()(2, 0) * in(0, 0) + operator()(2, 1) * in(1, 0) + operator()(2, 2) * in(2, 0) + operator()(2, 3) * in(3, 0),
operator()(2, 0) * in(0, 1) + operator()(2, 1) * in(1, 1) + operator()(2, 2) * in(2, 1) + operator()(2, 3) * in(3, 1),
operator()(2, 0) * in(0, 2) + operator()(2, 1) * in(1, 2) + operator()(2, 2) * in(2, 2) + operator()(2, 3) * in(3, 2),
operator()(2, 0) * in(0, 3) + operator()(2, 1) * in(1, 3) + operator()(2, 2) * in(2, 3) + operator()(2, 3) * in(3, 3),
operator()(3, 0) * in(0, 0) + operator()(3, 1) * in(1, 0) + operator()(3, 2) * in(2, 0) + operator()(3, 3) * in(3, 0),
operator()(3, 0) * in(0, 1) + operator()(3, 1) * in(1, 1) + operator()(3, 2) * in(2, 1) + operator()(3, 3) * in(3, 1),
operator()(3, 0) * in(0, 2) + operator()(3, 1) * in(1, 2) + operator()(3, 2) * in(2, 2) + operator()(3, 3) * in(3, 2),
operator()(3, 0) * in(0, 3) + operator()(3, 1) * in(1, 3) + operator()(3, 2) * in(2, 3) + operator()(3, 3) * in(3, 3)};
});
}
以及来自编译器的此错误:
1>Project\Application\include\maths.h(723,34): warning C4346: 'mat<Type,4,4>::*': dependent name is not a type
我该如何解决这个问题?
【问题讨论】:
-
代码中有几个问题与您的问题无关。例如
operator()(i, j) = i == j ? 1 : 0;但operator()返回const -
如果不专门化整个类模板,就无法专门化单个方法。您可以将
operator*设为免费功能 -
@463035818_is_not_a_number 你能举个例子吗?
-
xdim和ydim变量的意义何在?特别是因为你几乎不使用它们而不是x_dim和y_dim。 -
我对 cpp 有点陌生。谢谢你的建议。 :)
标签: c++ templates template-specialization