2010-06-19 4 views
0

si j'ai par exemple une classe Base et qui en dérivent Derived J'ai aussi une liste de pointeurs partagés:pointeurs aux membres issus de la classe

list<shared_ptr<Base> > list 

Je crée pointeur partagé:

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

ma question est, puis-je faire quelque chose comme ceci:

list.push_back(ptr); 

Si oui, quelqu'un peut expliquer pourquoi puis-je recevoir une erreur (je reçois ceci sur la ligne 5)

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

merci à l'avance pour toute aide

+0

Votre problème est avec le constructeur de' Derived', alors pourquoi nous vous montrer comment il est déclaré et comment l'utilisez-vous? –

+0

D'accord, cela devrait fonctionner ainsi le problème doit être dans le code que vous n'avez pas montré. – Hitobat

Répondre

1

ma question est, puis-je faire quelque chose comme ceci: list.push_back(ptr);

Oui - votre problème n'a rien à voir avec l'héritage ou des pointeurs intelligents - vous simplement ne pas le constructeur a déclaré que vous essayez d'utiliser.

Un exemple simple qui reproduit l'erreur est:

struct X {}; 
X x(1); 

Ce qui vous donne:

pas de fonction concordante pour appel à 'X::X(int)'

Vous correctif soit la construction de l'instance différemment ou en ajoutant le constructeur manquant:

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

Vous essayez d'affecter une valeur de type shared_ptr<Derived> à un conteneur de shared_ptr<Base>. Essayez pointeur assignant à Derived à shared_ptr<Base>, puis en ajoutant que la liste <>:

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

Je suppose que votre première phrase voulait dire * "container of' shared_ptr '" *? C'est bien, voir par ex. la documentation: * "En particulier,' shared_ptr 'est implicitement convertible [...] en' shared_ptr 'où' U' est une base accessible de 'T'" *. –

+0

Vous avez raison. J'aurais dû revoir cet exemple plus près. Merci. –

Questions connexes