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

标签 c++ templates inheritance protected

我在从派生自另一个类模板的类模板访问 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 的两行。 ,并且编译顺利(现在在 class3 中授予了对变量 a 的访问权限)。这个问题肯定与模板有关。

最佳答案

您的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中的声明或public class2 部分定义:

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/

相关文章:

C++ 指针数组

c++ - 在 vs2010 上构建 opengl 项目后出现一些错误

c++ - 无法使用 std::for_each() 和 std::bind() 过滤 vector 中的元素并将这些过滤后的元素放入新 vector 中

c++ - 模板嵌套私有(private)类作为 friend

flutter - Dart:检查对象是否实现接口(interface)

c++ - Doxygen `@code` block 中的链接有时会丢失

java - Spring项目模板不显示模板

c++ - 从嵌套模板中删除 const

java - 带有文件名的子类中出现奇怪的错误

c# - 使用 JavaScript/jQuery 从另一个类调用 C# 方法