矩阵转置模板

时间:2016-04-05 02:25:10

标签: c++ templates matrix

当我尝试使用模板编写矩阵转置代码时,我有以下错误。

  

错误1错误C2248:' Matrix :: elements' :无法访问类' Matrix'

中声明的私有成员

有谁能告诉我如何修复此错误?

//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();
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

Matrix<T, n, m>时,

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

您可以添加好友声明来解决问题:

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>;
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
};

答案 2 :(得分:0)

错误在您的代码中使用以下函数:

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。在此Matrix元素是一个私有变量,因此您无法访问它。我建议创建一个公共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;
}

这将解决您的问题。但是,从侧面说明我认为您的项目设计可以完全调整,以完全避免在另一个Matrix对象中使用Matrix。您是否考虑过指向动态分配的Matrix的指针?这将大大减少程序复制的数量,并极大地提高程序的内存和运行时效率。

希望这有帮助!