je suis tombé sur une erreur du compilateur qui n'a pas fait sens pour moi:Pourquoi ne pas auto_ptr Travaux de construction en utilisant = syntaxe
#include <memory>
using namespace std;
auto_ptr<Table> table = db->query("select * from t");
erreur: la conversion de « Table * » type non scalaire ' std :: auto_ptr < Table> » a demandé
Cependant, la ligne suivante fonctionne:
auto_ptr<Table> table(db->query("select * from t"));
Qu'est-ce sur ce definiton du constructeur qui l'empêche de travailler comme je l'attends? Je pensais que les déclarations initialisées utilisaient les constructeurs.
Voici mon constructeur d » auto_ptr
(de la STL SGI):
explicit
auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
Ugh. Juste au moment où je me convaincs que j'ai trouvé une utilisation pour auto_ptr, son design me frappe au visage. Retour pour aller effacer –
Ne laissez pas tomber auto_ptr juste pour ça. Utilisez simplement le constructeur explicite: table auto_ptr
Il y a une très bonne raison pour que le constructeur soit explicite. Il vous protège des erreurs accidentelles. C'est assez facile de mettre le auto_ptr (...) autour. –
lothar
Vous devez utiliser
auto_ptr ne définit pas un opérateur d'affectation pour son type de modèle. La seule affectation autorisée provient d'un autre auto_ptr (et son constructeur est explicite). Ceci est fait pour protéger le mauvais usage accidentel de auto_ptr, car auto_ptr assume la propriété de la mémoire.
Je pense que vous avez besoin du formulaire de cession d'utiliser plusieurs requêtes après l'autre comme:
Source
2009-04-16 18:35:48 lothar
Pourquoi ne pas 'auto_ptr
Eh bien, il a pensé que vous-même (voir sa question). Et le formulaire d'affectation est nécessaire chaque fois que vous faites plus d'une requête après l'autre :-) – lothar
Je souhaite qu'il y avait un moyen de modifier les commentaires. uou - sacrément rapide dactylographie ;-) – lothar
Ajoutant à ce que lothar dit: Parce que le constructeur
auto_ptr
est déclarée avec le mot-cléexplicit
, vous besoin d'utiliser une distribution explicite pour créer unauto_ptr
à partir d'un pointeur brut. (Avant l'introduction deexplicit
, le moulage implicite était le fléau de nombreux développeurs C++ nouveaux et expérimentés).Source
2009-04-16 18:39:28
Le constructeur est déclaré comme explicite, ce qui signifie qu'il ne sera pas utilisé pour le cast de type implicite. La conversion implicite en auto_ptr pourrait facilement conduire à des situations indésirables puisque auto_ptr prend possession du pointeur. Par exemple, si auto_ptr autorisait la conversion implicite d'un pointeur et que vous passiez accidentellement un pointeur vers une méthode utilisant un auto_ptr, le pointeur serait converti silencieusement en un auto_ptr et serait ensuite supprimé lorsque la fonction se terminerait, même si cela ne t l'intention.Mais en marquant le constructeur comme une conversion explicite, vous ne pouvez plus passer en mode silencieux et en appelant le constructeur, vous exprimez clairement l'intention de transmettre la propriété à auto_ptr, évitant ainsi toute confusion potentielle.
Source
2009-04-16 19:01:12
Questions connexes