如果我有一些类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
提前感谢任何帮助
答案 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;
}
`