clang 不识别受保护的数据成员

clang does not recognize protected data members

我正在将一些遗留代码从 MS visual studio 移植到 Clang,并将 运行 移植到受保护数据成员的问题中。简而言之,我的问题是:

template<typename T>
class Base : public SuperBase<T> {
public:
  Base(std::shared_ptr<Widget<T>> const& sb) : sb_(sb) {}

protected:
  std::shared_ptr<Widget<T>> sb_;
}

template <typename T>
class Derived : public Base<T>
{
public:
  Derived(std::shared_ptr<Widget<T>> const& sb) : Base<T>(sb) {}

  double method(void) const { return sb_->number(); }
}

这在 MSVC++ 下编译得很好,但在 Clang 下编译不好。 Clang 抱怨:

使用未声明的标识符 sb_。

遵循 Meyers Effective C++ 我不经常使用 protected 并且可以重写不使用的代码,但我仍然想知道为什么 Clang 在这里抱怨,因为 Derived class 应该能够看到 protected基地成员class。我错过了什么?

unique_ptrs 不可复制,您正试图将它们复制到 Base 的构造函数中,这应该是您尝试修复的第一个错误,之后的所有内容都可能会自动修复,如果你看看你在 clang 输出中得到的第一个错误并修复它

正如评论中指出的那样,sb_ 是指针而不是引用,您应该在其上使用 -> 运算符,而不是 . 所以更改 sb_->number()sb_->number()

尝试this->sb_->number()

When should I make explicit use of the `this` pointer?