Aucun constructeur de copie constructeur disponible ou une copie est déclarée « explicite »
-
26-09-2019 - |
Question
Quelqu'un pourrait-il expliquer pourquoi s'il vous plaît, je reçois une erreur de compilation ici - erreur C2558: class « std :: auto_ptr <_Ty> »: pas de constructeur de copie disponible ou constructeur de copie est déclarée « explicite »
#include <memory>
#include <vector>
#include <string>
template<typename T>
struct test
{
typedef std::auto_ptr<T> dataptr;
typedef std::auto_ptr< test<T> > testptr;
test( const T& data ):
data_( new T(data) )
{
};
void add_other( const T& other )
{
others_.push_back( testptr( new test(other) ) );
}
private:
dataptr data_;
std::vector< testptr > others_;
};
int main(int argc, char* argv[])
{
test<std::string> g("d");
//this is the line that causes the error.
g.add_other("d");
return 0;
}
La solution
Fondamentalement, un std::auto_ptr
ne peut pas être utilisé de cette façon.
others_.push_back( testptr( new test(other) ) );
Exige qu'un constructeur de copie qui prend un const&
existe et aucun constructeur existe pour std::auto_ptr
. Ceci est largement considéré comme un bonne chose depuis vous ne devez jamais utiliser std::auto_ptr
dans un conteneur Si vous ne comprenez pas pourquoi cela est, alors
Autres conseils
others_.push_back( testptr( new test(other) ) );
Vous essayez de pousser un auto_ptr
dans un std::vector
auto_ptr
ne pas définir un constructeur de copie implicite et n'est pas compatible en tant que valeur dans les classes de conteneurs stl.
Voir cette question pour plus d'informations: StackOverflow: Pourquoi est-ce mal d'utiliser stdauto ptr avec des conteneurs stl
Vous ne pouvez pas créer des conteneurs de la bibliothèque standard de auto_ptr, comme vous essayez de faire ici:
std::vector< testptr > others_;
car ils ne sont pas la sémantique correcte. Vous devrez utiliser des pointeurs ordinaires ou un goût différent de pointeur intelligent, comme shared_ptr
.
Vous voulez probablement std :: unique_ptr ou std :: shared_ptr du prochain C ++ 0x standard qui remplacera auto_ptr si vous avez accès à un compilateur qui a mis en œuvre ces (gcc 4.5 +)
http: //www2.research.att .com / ~ bs / C ++ 0xFAQ.html # std-unique_ptr http://www2.research.att.com/ ~ bs / C ++ 0xFAQ.html # std-shared_ptr