【问题标题】:matrix transpose template矩阵转置模板
【发布时间】:2016-04-05 02:25:09
【问题描述】:

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

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

【问题讨论】:

  • 您对模板参数和变量都使用了m。让它们与众不同。

标签: c++ templates matrix


【解决方案1】:

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

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

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】:

    问题是Matrix&lt;T, m, n&gt;Matrix&lt;T, n, m&gt; 是不同的类,而mn 不一样。一个不能访问另一个的private 成员。您可以通过提供public 成员函数来避免访问问题,这些函数提供对private 成员变量的访问。

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

    【讨论】:

      【解决方案3】:

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

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

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        • 2018-04-11
        • 2014-09-08
        • 2020-09-28
        • 1970-01-01
        相关资源
        最近更新 更多