C++ clang无法识别受保护的数据成员

C++ clang无法识别受保护的数据成员,c++,visual-c++,clang++,C++,Visual C++,Clang++,我将一些遗留代码从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&

我将一些遗留代码从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(); }
}
模板
类基:公共超基{
公众:
Base(std::shared_ptr const&sb):sb_(sb){
受保护的:
std::共享的ptr sb;
}
模板
派生类:公共基
{
公众:
派生(std::shared_ptr const&sb):基(sb){
double方法(void)常量{return sb->number();}
}
这可以在MSVC++下很好地编译,但不能在Clang下编译。Clang抱怨说:

使用未声明的标识符sb_


迈尔斯有效C++之后,我不使用很多保护,可以重写代码而不使用,但我仍然不明白为什么Clang在这里抱怨,因为派生类应该能够看到基类的受保护成员。我遗漏了什么?

unique\u ptr
是不可复制的,您正在尝试在
Base
的构造函数中复制它们,这应该是您尝试修复的第一个错误,如果您查看clang输出中的第一个错误并修复该错误,之后的一切可能都会自动修复


此外,正如评论中所指出的,
sb\uu
是一个指针而不是一个引用,您应该在其上使用
->
操作符,而不是
,因此将
sb\uu->number()
更改为
sb\uu->number(),您正试图在
Base
的构造函数中复制它们,这应该是您尝试修复的第一个错误,如果您查看clang输出中的第一个错误并修复该错误,那么之后的所有错误都可能会自动修复


此外,正如评论中所指出的,
sb\uu
是一个指针,而不是一个引用,您应该在它上面使用
->
操作符,而不是
,所以将
sb\uu->number()
更改为
sb\uu->number()
试试
这个->sb\u->number()


试试
这个->数字()


您可以发布整个错误消息,或者至少部分错误消息吗?我怀疑实际的问题是
sb_
没有名为
number
的函数。不应该是
sb_->number()?MCVE………..?我无法在MSVC++中编译此代码,因为此代码有许多问题,但未声明的标识符
sb\uu
将在副本中处理。您能否发布整个错误消息,或至少部分错误消息?我怀疑实际的问题是
sb_
没有名为
number
的函数。不应该是
sb_->number()?MCVE………..?我无法在MSVC++中编译此代码,因为此代码有许多问题,但未声明的标识符
sb_uu
在dupe中处理。IMHO,如果您知道这是一个dupe,最好将其标记为dupe,而不是(再次)回答它。我同意,但不幸的是,我无权以重复的形式结束问题。谢谢。事实上,如果基类是模板化的,它应该显式地使用它。IMHO,如果你知道这是一个重复,最好将它标记为这样,而不是(再次)回答它。我同意,但不幸的是,我没有权利以重复的形式结束问题。谢谢。事实上,如果基类被模板化,它应该显式地使用它。