1

我有一个模板基类。可以说。

template<class KeyF>
class Base 
{
  private:
   int member1;
   char member2;
   ....
};

我从上面的类派生了另一个类。

template<class KeyF>
class Derived : public Base<KeyF>
{
  public:
  void func1() {
    <accessing member1/member2>
  }

  ....
};

上面的代码不能在 gcc 中编译。说 member1 不是 Derived 的成员。但是它已经是从一个基类派生的,那为什么不能访问它的成员呢?

4

4 回答 4

3

中的成员Baseprivate。您无法访问private members该课程之外的课程(除了friend)。制造它们protected,或者制造protected getters

于 2012-09-20T14:22:51.330 回答
1

你试过受保护吗?自从我深入研究 C++ 以来,已经有点...

于 2012-09-20T14:24:25.683 回答
1

您需要使用this->or为基成员名称添加前缀Base<KeyF>::,或者向类添加using声明以取消隐藏它们。它们的名称是从属名称,并且它们是隐藏的。

于 2012-09-20T14:25:35.097 回答
0

我认为解决该问题需要进行两项更改:

  1. 在基类中,将成员定义为“受保护”而不是“私有”,以便在派生类中可访问。

  2. 在派生类中,在受保护成员之前添加基类名称。在这种情况下,它应该看起来像“Base<typename>::member1”。

在我的情况下使用 C++17 标准,问题得到了解决。希望这会有所帮助。感谢 Kerrek SB 提供的信息。

于 2020-11-19T14:41:02.377 回答