我对以下错误有一个非常笼统的问题,我提前感谢任何有用的评论。我简化了编码,指出了我收到的错误。 (当我尝试在子类成员函数中访问父类的对象和变量时出错。我在评论中写了错误摘要)假设我有以下代码。
//here is the parent class
template<class T, int m, int n>
class A{
protected:
vector<vector<T>> elements;
int nrow;
int ncol;
public:
A();
}
A<T,m,n>::A():nrow(m),ncol(n){
for (int i = 0; i < nrow; i++){
vector<T> row(ncol, 0);
elements.push_back(row);
}//this is a constructor to assign MxN zero matrix
//here is the child class and member function assign() and pow()
template<class T, int n>
class B:public A<T,n,n>{
B();
B<T,n> assign();
}
template<class T, int n>
B<T, n>::B() : A<T, n, n>(){}//a constructor of child class for NxN square matrix
template<class T, int n>
B<T,n> B<T,n>::assign(){
A<T,n,2*n> a;
for (int i = 0; i < nrow; ++i){
for (int j = 0; j < ncol; ++j){
//this causes error saying that "Error 1 error C2248:'A<T,3,3>::elements' : cannot access protected member declared in class 'A<T,3,3>'"
a.elements[i][j] = elements[i][j];
}
}
b.elements[0][0] = a.elements[0][0];
return b;
}
如果我的编码不足以回答我的问题。我可以提供全部细节。我的最终目标是制作Nx2N matrix.a并将NxN矩阵的元素放入matrix.a的左半部分,并在成员函数assign()中进行一些计算。 (或者甚至可能?????)在main.cpp中,我调用了3x3矩阵。
答案 0 :(得分:1)
你没有“简化你的编码”。您可以使用更短的示例轻松地重现编译错误:
class A {
protected:
int n=0;
};
class B : public A {
public:
B()
{
n=4;
A a;
a.n=n;
}
};
这将导致与复杂模板代码相同的编译错误。
A
确实使其成员可以作为受保护的访问类使用。所有这些意味着继承自B
的子类A
可以访问其超类的受保护变量。但这并不意味着子类B
可以访问另一个A
实例的受保护变量。
这是你的根本问题。它与矩阵操作的具体细节或与之相关的任何内容无关。它归结为继承和公共/受保护/私有访问的工作方式。您只需重新设计课程,以便实现您想要实现的目标。
这是gcc错误消息比Microsoft编译器更易读的另一个例子(因为这是你似乎正在使用的)。比较gcc很容易理解诊断:
t.C: In constructor ‘B::B()’:
t.C:5:8: error: ‘int A::n’ is protected
int n=0;
^
t.C:18:5: error: within this context
a.n=n;
^
使用编译器的神秘诊断。 “在这种背景下”这一部分不仅明确指出了违规陈述,而且明确指出了具体的参考,“a.n”,这就是问题所在。