gpt4 book ai didi

c++ - 无法在 C++ 类模板的第二级继承中访问 protected 类成员

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:35 26 4
gpt4 key购买 nike

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

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

替换 using class2<T>::a;using class1<T>::a;在 class3 中没有帮助。究竟是什么导致了这个错误?如果我真的需要访问变量 a,我该如何避免它?从 class3 中?为什么第一级继承(class2)没有检测到任何问题,而第二级(class3)?感谢您提出任何意见。

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

最佳答案

你的 class2定义同下:

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

是因为privateclass 成员的默认部分es。所以 a成员在这里变为私有(private)并且不能被 class3 继承.您应该明确放置 using class1<T>::a; protected 中的声明或 publicclass2定义:

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

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

关于c++ - 无法在 C++ 类模板的第二级继承中访问 protected 类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47399202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com