Clang 无法识别受保护的数据成员

clang does not recognize protected data members

本文关键字:数据成员 受保护 识别 Clang      更新时间:2023-10-16

我正在将一些遗留代码从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下不能。叮当抱怨道:

使用未声明的识别符sb_。

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

试试this->sb_->number() .

何时应显式使用"this"指针?

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

此外,正如注释中指出的那样,sb_是指针而不是引用,您应该在其上使用 -> 运算符,而不是.因此sb_->number()更改为sb_->number()