指向类的派生成员的指针

时间:2010-06-19 13:13:59

标签: c++

如果我有一些类Base并从中派生Derived 我还有一些共享指针列表:

list<shared_ptr<Base> > list

我创建共享指针:

line 5    shared_ptr<Derived> ptr(new Derived(//some constructor));

我的问题是,我可以这样做:

list.push_back(ptr);

如果是,有人可以解释为什么我会收到错误(我在第5行收到此信息)

no matching function for call to //here It writes me my constructor to Derived

提前感谢任何帮助

2 个答案:

答案 0 :(得分:1)

  

我的问题是,我可以这样做:list.push_back(ptr);

是的 - 您的问题与继承或智能指针无关 - 您只是没有声明您尝试使用的构造函数。

重现错误的一个简单示例是:

struct X {};
X x(1);

这给了你:

  

没有用于调用“X::X(int)

的匹配函数

通过不同地构造实例或添加缺少的构造函数来解决这个问题:

struct X { X(int) {} };

答案 1 :(得分:0)

您正尝试将shared_ptr<Derived>类型的值分配给shared_ptr<Base>的容器。尝试将指向Derived的指针分配给shared_ptr<Base>,然后将其添加到列表&lt;&gt;:

class BASE {
 public:
  BASE() { }
  const char *name() const { return nameImpl(); }
 private:
  virtual const char *nameImpl() const { return "BASE"; }
};

class DERIVED : public BASE {
 public:
  DERIVED() { }
 private:
  virtual const char *nameImpl() const { return "DERIVED"; }
};


int main() {

 list< shared_ptr< BASE > > baseSequence;

 shared_ptr< BASE > basePtr(new BASE);
 baseSequence.push_back( basePtr );
 basePtr.reset(new DERIVED);
 baseSequence.push_back( basePtr );

 shared_ptr< DERIVED > derivedPtr(new DERIVED);
 baseSequence.push_back( derivedPtr ); 

 BOOST_FOREACH(const shared_ptr< BASE > &ptr, baseSequence) {
  cout << ptr->name() << "\n";
 }
 return 0;
}

`