我正在将一些遗留代码从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 ++我不会使用受保护的东西并且可以重写不使用的代码,但我仍然想知道为什么Clang会在这里抱怨,因为Derived类应该能够看到Base的受保护成员类。我错过了什么?
答案 0 :(得分:2)
尝试this->sb_->number()
。
答案 1 :(得分:0)
unique_ptr
是不可复制的,你试图在Base
的构造函数中复制它们,这应该是你尝试修复的第一个错误,之后的所有内容如果你看起来可能会自动修复在clang输出中出现的第一个错误并修复
正如评论中指出的那样,sb_
是一个指针,而不是一个引用,您应该在其上使用->
运算符,而不是.
所以更改sb_->number()
} sb_->number()