当我尝试使用模板编写矩阵转置代码时,我有以下错误。
错误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();
}
答案 0 :(得分:1)
问题是当Matrix<T, m, n>
和Matrix<T, n, m>
不相同时m
和n
是不同的类。一个人无法访问另一个的private
成员。您可以通过提供public
成员函数来避免访问问题,这些成员函数可以访问private
成员变量。
如果m
和n
相同,您将不会注意到该问题。
答案 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的指针?这将大大减少程序复制的数量,并极大地提高程序的内存和运行时效率。
希望这有帮助!