无法访问 C++ 中类模板继承的第二级上的受保护类成员

Cannot access protected class member on the second level of inheritance of class templates in C++

本文关键字:二级 成员 受保护 C++ 继承 访问      更新时间:2023-10-16

我从派生自另一个类模板的类模板访问受保护的类成员时遇到问题。我有三个类模板,第二个派生自第一个,第三个派生自第二个。具体说来

类1.h:

template <typename T> class class1
{
protected:
T data;
int a;
public:
class1();
void someMethod();
};

类2.h:

#include "class1.h"
template <typename T> class class2: public class1<T>
{
using class1<T>::a;
T otherData;
public:
class2();
};

类3.h:

#include "class2.h"
template <typename T> class class3: public class2<T>
{
using class2<T>::a;
public:
class3();
};

类2.cpp:

#include "class2.h"
#include <iostream>
template <typename T> class2<T> :: class2()
{
std::cout<<"Creating class2 object!"<<std::endl;
a = 2;
}
template class class2<double>;

最后,类3.cpp:

#include "class3.h"
#include <iostream>
template <typename T> class3<T> :: class3()
{
std::cout<<"Creating class3 object!"<<std::endl;
a = 3;
}
template class class3<double>;

当我将class2.cpp编译成一个目标文件时,如下所示:

g++ -c -O3 -std=c++11 -Wall -o class2.o class2.cpp

一切顺利。但是,以相同的方式编译 class3 时.cpp 出错。弹出以下错误:

In file included from class2.h:4:0,
from class3.h:4,
from class3.cpp:1:
class3.h: In instantiation of ‘class class3<double>’:
class3.cpp:11:16:   required from here
class1.h:9:6: error: ‘int class1<double>::a’ is protected
int a;
^

在 class3 中将using class2<T>::a;替换为using class1<T>::a;无济于事。 究竟是什么导致了此错误,如果我确实需要从 class3 中访问变量a,我该如何避免它?为什么第一级继承(类 2)没有检测到任何问题,而第二级(类 3)检测到任何问题?感谢您的任何评论。

注意:我尝试了相同类型的继承,但没有模板并删除了包含using的两行,并且编译进展顺利(现在在 class3 中授予对变量a的访问权限)。问题肯定与模板有关。

您的class2定义与以下内容相同:

template <typename T> class class2: public class1<T>
{
private: // default section
using class1<T>::a;
T otherData;
public:
class2();
};

这是因为privateclasses 成员的默认部分。所以a成员在这里成为私有的,不能被class3继承。应将语句显式地放在class2定义的protectedpublic部分中using class1<T>::a;

template <typename T> class class2: public class1<T>
{
T otherData;
protected: // <-- added
using class1<T>::a;
public:
class2();
};

现在可以从class2派生类(包括class3)访问它。