【问题标题】:`In instantiation of [template class] [member] is protected [. . .] [public member] is inaccessible'`在 [模板类] [成员] 的实例化中受保护 [. . .] [公共成员] 无法访问'
【发布时间】:2014-08-08 19:23:25
【问题描述】:

尝试实例化SystemBodyAcceleratedBody 类型的类时遇到以下错误:

error: 'bool InitializationChecker::is_initialized_' is protected

确实,is_initialized_ protected

class InitializationChecker {
 [. . .]
 protected:
  bool is_initialized_;
};

is_initialized_ 通过其他几个类继承自 InitializationChecker

InitializationChecker
           ^
           |
MultipleInitializationChecker
  ^
  |
Body
  ^
  |
AcceleratedBody
     ^
     |
SystemBody

Body 是这样声明的:

template<typename Type> class Body : public MultipleInitializationChecker {
  using MultipleInitializationChecker::is_initialized_;
 public:
  Body() {
    this->is_initialized_ = false;
  }
  Body(const Scalar<Type> mass__,
       const CartesianVector<Type> position__,
       const CartesianVector<Type> velocity__)
      : mass_(mass__),
        position_(position__),
        velocity_(velocity__) {
          this->is_initialized_ = true;
  }
  [. . .]
  Scalar<Type> mass_;
  CartesianVector<Type> position_;
  CartesianVector<Type> velocity_;
};

我还遇到了另一个问题:SystemBody 的一些成员无法访问。例如:

error: 'Scalar<double> Body<double>::mass_' is inaccessible

当我尝试执行以下操作时输出:

SystemBody<double> system_body;
std::cout << system_body.mass_.value();

即使SystemBody 只添加了一个不相关的私有成员并且AcceleratedBody 被声明为这样:

template<typename Type> class AcceleratedBody : public Body<Type> {
  using Body<Type>::is_initialized_;
  using Body<Type>::mass_;
  using Body<Type>::position_;
  using Body<Type>::velocity_;
 public:
  AcceleratedBody() : Body<Type>::Body() {}
  AcceleratedBody(const Scalar<Type> mass__,
                  const CartesianVector<Type> position__,
                  const CartesianVector<Type> velocity__,
                  const CartesianVector<Type> acceleration__)
      : Body<Type>::Body(mass__, position__, velocity__),
        acceleration_(acceleration__) {}
  [. . .]
  CartesianVector<Type> acceleration_;
};

请注意,mass_position_velocity_ 都在 Body 中公开声明。

【问题讨论】:

  • 请把它钉在一个感兴趣的地方(错误信息发生在哪里以及为什么你不期望它)。
  • @πάνταῥεῖ 最好发布代表我的课程的简单代码吗?

标签: c++ templates inheritance


【解决方案1】:

using MultipleInitializationChecker::is_initialized_; 在类的私有区域中执行此操作使其成为私有区域。你甚至不需要那条线。你觉得它有什么作用?

【讨论】:

  • 啊,我想知道它们的位置!我没有想到他们放置的哪个访问修饰符会影响他们转发的变量的访问。现在一切正常! (时间一到,我会在几分钟内接受你的回答。)
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 2018-04-17
  • 2011-12-25
  • 2015-01-30
  • 2013-11-30
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多