2010-06-19 190 views
0

的派生成员如果我有例如一些类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

你的问题是与Derived'的'构造函数,所以你为什么不告诉我们它是如何宣布和如何使用它? – 2010-06-19 13:25:45

+0

同意,这应该工作,所以问题必须在你没有显示的代码中。 – Hitobat 2010-06-19 15:53:08

回答

1

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

是 - 你的问题无关,与继承或智能指针 - 你根本就没有构造函数中声明你正在尝试使用。

再现错误一个简单的例子是:

struct X {}; 
X x(1); 

它给你:

没有匹配函数调用 'X::X(int)'

您解决这个问题的任何以不同方式构造实例或添加缺少的构造函数:

struct X { X(int) {} }; 
0

您正试图将一个类型为shared_ptr<Derived>的值分配给shared_ptr<Base>的容器。尝试分配指针Derivedshared_ptr<Base>,然后补充说,到列表<>:

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; 
} 

`

+0

我想你的第一句话是说*“shared_ptr '的容器*”?这很好,例如见文件:*“特别是,'shared_ptr '可以隐式转换为'shared_ptr ',其中'U'是'T' * *的可访问基础。 – 2010-06-19 16:18:12

+0

你是对的。我应该更仔细地回顾一下这个例子。谢谢。 – 2010-06-19 23:22:50