矩阵转置模板

matrix transpose template

本文关键字:转置      更新时间:2023-10-16

当我试图使用模板编写矩阵转置的代码时,我会出现以下错误。

错误1错误C2248:"矩阵::元素":无法访问类"矩阵"中声明的私有成员

有人能告诉我如何纠正这个错误吗?

//Matrix.h
#include <iostream>
#include <vector>
using namespace std;
template<class T, int m, int n>
class Matrix;

template<class T, int m, int n>
class Matrix
{
vector<vector<T>> elements;
int nrow;
int ncol;
public:
Matrix();
~Matrix();
void print();
Matrix<T, n, m> transpose();
};
template<class T, int m, int n>
Matrix<T, m, n>::Matrix() : nrow(m), ncol(n)
{
for (int i = 0; i < nrow; i++){
    vector<T> row(ncol, i);
    elements.push_back(row);
}
}
template<class T, int m, int n>
Matrix<T, m, n>::~Matrix(){}
template<class T, int m, int n>
Matrix<T, n, m> Matrix<T, m, n>::transpose(){
Matrix<T, n, m> m;
for (int i = 0; i < nrow; ++i){
    for (int j = 0; j < ncol; ++j){
        m.elements[j][i] = elements[i][j];
    }
}
return m;
}
template<class T, int m, int n>
void Matrix<T, m, n>::print()
{
for (int i = 0; i < nrow; i++){
    for (int j = 0; j < ncol; j++)
    {
        cout << elements[i][j] << " ";
    }
    cout << endl;
}
}
//main.cpp
#include "Matrix.h"
using namespace std;
int main()
{
Matrix<int, 3, 2> a;
Matrix<int, 3, 2> b;
Matrix<int, 2, 3> c;
c = a.transpose();
c.print();
}

Matrix<T, n, m>Matrix<T, m, n>m != n时完全是不同的类。这意味着您无法在Matrix<T, m, n>的成员函数中访问Matrix<T, n, m>的私有成员。

你可以添加好友声明来解决这个问题:

template<class T, int m, int n>
class Matrix
{
    vector<vector<T>> elements;
    int nrow;
    int ncol;
    public:
    Matrix();
    ~Matrix();
    void print();
    Matrix<T, n, m> transpose();
    friend class Matrix<T, n, m>;
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
};

问题是当mn不同时,Matrix<T, m, n>Matrix<T, n, m>是不同的类。一方无法访问另一方的private成员。您可以通过提供public成员函数来避免访问问题,这些函数提供对private成员变量的访问。

如果mn相同,您不会注意到问题。

错误在于代码中的以下函数:

template<class T, int m, int n>
Matrix<T, n, m> Matrix<T, m, n>::transpose() {
    Matrix<T, n, m> m;
    for (int i = 0; i < nrow; ++i) {
        for (int j = 0; j < ncol; ++j) {
            m.elements[j][i] = elements[i][j];
        }
    }
    return m;
}

错误的原因是您正在创建一个新的矩阵m。在这个矩阵中,元素是一个私有变量,因此你不能访问它。我建议要么创建一个公共getter函数来返回指向元素的指针,要么让元素成为公共变量(但这可能不是一个好的风格,因为它没有封装数据)。

getter函数可以很简单:

vector<vector<T> >* get_elements_ptr() {
    return &elements;
}

你的问题函数应该看起来像:

template<class T, int m, int n>
Matrix<T, n, m> Matrix<T, m, n>::transpose() {
    Matrix<T, n, m> m;
    for (int i = 0; i < nrow; ++i) {
        for (int j = 0; j < ncol; ++j) {
            m.get_elements_ptr()->at(j)[i] = elements[i][j];
        }
    }
    return m;
}

这将解决您的问题。然而,顺便说一句,我认为你的项目设计可以完全调整一下,以完全避免在另一个矩阵对象中有矩阵。您是否考虑过使用一个指向动态分配矩阵的指针?这将极大地减少程序的复制量,并将大大提高程序的内存和运行效率。

希望这能有所帮助!