2010-06-18 5 views
3

J'ai un type prédéfini qui hérite de boost :: noncopyable (donc je dois stocker le pointeur sur ces objets). J'utilise un boost :: ptr_map. Comme je le sais, le deuxième argument est déjà un pointeur. Ainsi, le code:ptr_map insertion

ptr_map<string, boost::any> SomeMap; 
typedef %Some noncopyable class/signature% NewType; 

// Inserting now 
boost::any *temp = new boost::any(new KeyEvent()); 
SomeMap.insert("SomeKey", temp); 

L'erreur est:

error: no matching function for call to ‘boost::ptr_map<std::basic_string<char>, boost::any>::insert(const char [11], boost::any*&)’


UPD: Quand je ne passe pas le pointeur sur l'une any temp = any(new KeyEvent());

Je reçois :

error: no matching function for call to ‘boost::ptr_map<std::basic_string<char>, boost::any>::insert(const char [11], boost::any&)’

+2

Pourquoi ne pas 'SomeMap [ » SomeKey "] = temp;'? – Cubbi

+1

@Cubbi: cela va compiler, mais ce ne sera pas une exception en toute sécurité. 'temp' va fuir si le constructeur de la chaîne ou l'insertion de l'élément vide se lève. –

+0

@Mike Seymour: Vous avez raison. C'est ce que j'obtiens pour n'utiliser que des pointeurs intelligents pendant plusieurs années. – Cubbi

Répondre

6

Cette version de insert prend la clé par référence non-const, ce qui signifie que vous ne pouvez pas utiliser de temporaire comme première valeur. C'est pour éviter les fuites de mémoire; dans votre code, temp fuirait si le constructeur de chaîne devait lancer.

Vous devez créer l'objet clé avant de créer le pointeur brut:

string key("SomeKey"); 
any* temp = new whatever; 
SomeMap.insert(key, temp); 

ou utiliser un auto_ptr pour faire en sorte que l'objet est supprimé, quoi qu'il arrive:

auto_ptr<any> temp(new whatever); 
SomeMap.insert("SomeKey", temp); 
+0

J'aime la deuxième manière, mais elle renvoie l'erreur: 'aucune fonction correspondante pour l'appel à 'std :: auto_ptr :: auto_ptr (NewType *)'' – Ockonal