Mais la liste n'est pas un unordered_set c'est une liste ou alors on parle pas de la même portion de code, la confusion doit venir de là,
c'est pas grave on va pas en faire une histoire... c'est un code non pro que je reprends en vacances pour faire des tests, c'est pas un truc pro, je me permets de changer les list en set ou unordered_set à mon gré plus tard pour faire des tests, c'est une sorte de bac à sable
oui c'est delete qu'il faut utiliser, je l'avais mis il y a 3 jours puis viré car induit en erreur car après avoir fais delete si j'avais gardé un pointeur vers l'objet deleté je pouvais encore l'utiliser... un peu surprenant! Mais effectivement il faut utiliser delete qui appelle le destructeur et ensuite désalloue la mémoire prise par l'objet, je reconnais j'avais pas utilisé ça depuis quelques décennies et récemment je faisais que des allocations statiques sans pointeur, c'est peut-être l'intérêt d'utiliser std::unique_ptr sauf que j'ai fait les modifs en 10 minutes et ça fait mal
make
----------
COMPILING
----------
g++ -I. -c -Wall -std=c++14 -DDEBUG_BUILD main.cpp
In file included from main.cpp:3:
In file included from /Library/Developer/CommandLineTools/usr/include/c++/v1/list:173:
/Library/Developer/CommandLineTools/usr/include/c++/v1/memory:1805:31: error: call to implicitly-deleted copy
constructor of 'std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > >'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/usr/include/c++/v1/memory:1715:18: note: in instantiation of function
template specialization 'std::__1::allocator<std::__1::__list_node<std::__1::unique_ptr<Point3D<float>,
std::__1::default_delete<Point3D<float> > >, void *> >::construct<std::__1::unique_ptr<Point3D<float>,
std::__1::default_delete<Point3D<float> > >, const std::__1::unique_ptr<Point3D<float>,
std::__1::default_delete<Point3D<float> > > &>' requested here
{__a.construct(__p, _VSTD::forward<_Args>(__args)...);}
^
/Library/Developer/CommandLineTools/usr/include/c++/v1/memory:1561:14: note: in instantiation of function
template specialization
'std::__1::allocator_traits<std::__1::allocator<std::__1::__list_node<std::__1::unique_ptr<Point3D<float>,
std::__1::default_delete<Point3D<float> > >, void *> >
>::__construct<std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > >, const
std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > > &>' requested here
{__construct(__has_construct<allocator_type, _Tp*, _Args...>(),
^
/Library/Developer/CommandLineTools/usr/include/c++/v1/list:1570:26: note: in instantiation of function
template specialization
'std::__1::allocator_traits<std::__1::allocator<std::__1::__list_node<std::__1::unique_ptr<Point3D<float>,
std::__1::default_delete<Point3D<float> > >, void *> >
>::construct<std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > >, const
std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > > &>' requested here
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
^
/Library/Developer/CommandLineTools/usr/include/c++/v1/list:1237:9: note: in instantiation of member function
'std::__1::list<std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > >,
std::__1::allocator<std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > > >
>::push_back' requested here
push_back(*__i);
^
./Universe.hpp:10:26: note: in instantiation of member function
'std::__1::list<std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > >,
std::__1::allocator<std::__1::unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > > >
>::list' requested here
template <class T> class Universe {
^
/Library/Developer/CommandLineTools/usr/include/c++/v1/memory:2440:3: note: copy constructor is implicitly
deleted because 'unique_ptr<Point3D<float>, std::__1::default_delete<Point3D<float> > >' has a
user-declared move constructor
unique_ptr(unique_ptr&& __u) noexcept
^
1 error generated.
make: *** [main.o] Error 1
bon ça aide pas beaucoup sans le code, mais j'ai juste remplacé naïvement point3d<T> * par std::unique_ptr<Point3D<T>>.
comme dans cet exemple:
1 2
| //list < Point3D<T> *> point3DptrList;
list < std::unique_ptr<Point3D<T>> > point3DptrList; |
c'est dans ces moments là ou je préfère le Scheme ou Lisp au C++
après utiliser std::unique_ptr<Point3D<T>> pour un point3D et un code qui fait 10 lignes et un point3d que je vais deleter 5 lignes plus bas.... ça revient un peu à traverser la rue escorté de 3 chiens d'aveugle pour pas se faire écraser... mais l'idée est bonne je vais persévérer,
bon je verrai tout ça demain, il commence à se faire tard....
oui je crois comprendre ce qui va pas, std::unique_ptr est très contre indiqué ici vu que justement je veux stocker des pointeurs dans des objets abstraits et que je pense que std::unique_ptr va pas aimer du tout ! que je les delegue à d'autres objets que lui même, vu que son rôle est de protéger le pointeur, même en faisant un move ça va être dur...
je comprends que vous soyez tous contre les pointeurs :-) au départ j'avais fait un code comme vous, c'est lorsque j'ai vu toutes les recopies implicites (j'ai d'autre objets beaucoup plus gros dans le code ailleurs) que j'ai eu l'idée de chercher à minimiser cela, ça parait un peu vieux ce que je vais dire mais quand j'étais étudiant il y a 25 ans le C++ avait la réputation d'être lent par rapport au C et j'ai utilisé il y a une dizaine d'année la bibliothèque boost::array et c'était beaucoup plus lent que des tableaux en C .
Partager