无法在 C++ 中的 class 模板的第二级继承中访问受保护的 class 成员
Cannot access protected class member on the second level of inheritance of class templates in C++
我在从另一个 class 模板派生的 class 模板访问受保护的 class 成员时遇到问题。我有三个 class 模板,第二个派生自第一个,第三个派生自第二个。具体来说,
class1.h:
template <typename T> class class1
{
protected:
T data;
int a;
public:
class1();
void someMethod();
};
class2.h:
#include "class1.h"
template <typename T> class class2: public class1<T>
{
using class1<T>::a;
T otherData;
public:
class2();
};
class3.h:
#include "class2.h"
template <typename T> class class3: public class2<T>
{
using class2<T>::a;
public:
class3();
};
class2.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>;
最后,class3.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 class1<T>::a;
替换 using class2<T>::a;
没有帮助。
究竟是什么导致了这个错误?如果我真的需要从 class3 中访问变量 a
,我该如何避免它?为什么第一层继承(class2)没有发现问题,第二层(class3)吗?感谢您的任何评论。
注意:我尝试了相同类型的继承,但没有模板并删除了包含 using
的两行,并且编译顺利(现在在 [=55= 中授予对变量 a
的访问权限]3).问题肯定与模板有关。
您的 class2
定义与以下相同:
template <typename T> class class2: public class1<T>
{
private: // default section
using class1<T>::a;
T otherData;
public:
class2();
};
这是因为 private
是 class
es 成员的默认部分。所以 a
成员在这里变成私有的,不能被 class3
继承。您应该明确地将 using class1<T>::a;
语句放在 class2
定义的 protected
或 public
部分:
template <typename T> class class2: public class1<T>
{
T otherData;
protected: // <-- added
using class1<T>::a;
public:
class2();
};
现在可以从class2
派生类(包括class3
)访问它。
我在从另一个 class 模板派生的 class 模板访问受保护的 class 成员时遇到问题。我有三个 class 模板,第二个派生自第一个,第三个派生自第二个。具体来说,
class1.h:
template <typename T> class class1
{
protected:
T data;
int a;
public:
class1();
void someMethod();
};
class2.h:
#include "class1.h"
template <typename T> class class2: public class1<T>
{
using class1<T>::a;
T otherData;
public:
class2();
};
class3.h:
#include "class2.h"
template <typename T> class class3: public class2<T>
{
using class2<T>::a;
public:
class3();
};
class2.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>;
最后,class3.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 class1<T>::a;
替换 using class2<T>::a;
没有帮助。
究竟是什么导致了这个错误?如果我真的需要从 class3 中访问变量 a
,我该如何避免它?为什么第一层继承(class2)没有发现问题,第二层(class3)吗?感谢您的任何评论。
注意:我尝试了相同类型的继承,但没有模板并删除了包含 using
的两行,并且编译顺利(现在在 [=55= 中授予对变量 a
的访问权限]3).问题肯定与模板有关。
您的 class2
定义与以下相同:
template <typename T> class class2: public class1<T>
{
private: // default section
using class1<T>::a;
T otherData;
public:
class2();
};
这是因为 private
是 class
es 成员的默认部分。所以 a
成员在这里变成私有的,不能被 class3
继承。您应该明确地将 using class1<T>::a;
语句放在 class2
定义的 protected
或 public
部分:
template <typename T> class class2: public class1<T>
{
T otherData;
protected: // <-- added
using class1<T>::a;
public:
class2();
};
现在可以从class2
派生类(包括class3
)访问它。