IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Pointeur sur une map et for each


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Novembre 2014
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Pointeur sur une map et for each
    Bonjour,
    J'ai un problème que je ne comprends pas, j'ai une map créer ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static std::map<std::string, T*>* _list;
    puis déclarer hors de la classe comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename T> std::map<std::string, T*>* ConstructableJsonHolder<T>::_list = NULL;
    et enfin pour éviter le problème d'initialisation des variables static j'ai une méthode qui retourne un pointeur vers la map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static std::map<std::string, T*>* list() {
    	if (_list == NULL) {
    		_list = new std::map<std::string, T*>();
    	}
    	return _list;
    }
    Jusque là aucun soucis.

    Le problème est que étant donné que ma map contient des objets créer avec new il faut que je les delete, donc lors de la destruction de ma classe j'essaye de libérer la mémoire en bouclant sur la map avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    virtual ~ConstructableJsonHolder() {
    	for (auto obj : list()) {
                   // instruction
    	}
    }
    le problème est que celà créer des erreurs de compilation que je ne comprends pas :
    src/../inc/ConstructableJson.hpp: In instantiation of ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’:
    src/Tile.cpp:4:12: required from here
    src/../inc/ConstructableJson.hpp:23:3: error: no matching function for call to ‘begin(std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*&)’
    for (auto obj : list()) {
    ^
    In file included from /usr/include/c++/5/string:51:0,
    from /usr/include/c++/5/bits/locale_classes.h:40,
    from /usr/include/c++/5/bits/ios_base.h:41,
    from /usr/include/c++/5/ios:42,
    from /usr/include/c++/5/ostream:38,
    from /usr/include/c++/5/iostream:39,
    from src/../inc/Tile.hpp:4,
    from src/Tile.cpp:1:
    /usr/include/c++/5/bits/range_access.h:87:5: note: candidate: template<class _Tp, long unsigned int _Nm> _Tp* std::begin(_Tp (&)[_Nm])
    begin(_Tp (&__arr)[_Nm])
    ^
    /usr/include/c++/5/bits/range_access.h:87:5: note: template argument deduction/substitution failed:
    In file included from src/../inc/Tile.hpp:8:0,
    from src/Tile.cpp:1:
    src/../inc/ConstructableJson.hpp:23:3: note: mismatched types ‘_Tp [_Nm]’ and ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*’
    for (auto obj : list()) {
    ^
    In file included from /usr/include/c++/5/string:51:0,
    from /usr/include/c++/5/bits/locale_classes.h:40,
    from /usr/include/c++/5/bits/ios_base.h:41,
    from /usr/include/c++/5/ios:42,
    from /usr/include/c++/5/ostream:38,
    from /usr/include/c++/5/iostream:39,
    from src/../inc/Tile.hpp:4,
    from src/Tile.cpp:1:
    /usr/include/c++/5/bits/range_access.h:58:5: note: candidate: template<class _Container> decltype (__cont.begin()) std::begin(const _Container&)
    begin(const _Container& __cont) -> decltype(__cont.begin())
    ^
    /usr/include/c++/5/bits/range_access.h:58:5: note: template argument deduction/substitution failed:
    /usr/include/c++/5/bits/range_access.h: In substitution of ‘template<class _Container> decltype (__cont.begin()) std::begin(const _Container&) [with _Container = std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*]’:
    src/../inc/ConstructableJson.hpp:23:3: required from ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/bits/range_access.h:58:5: error: request for member ‘begin’ in ‘__cont’, which is of pointer type ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >* const’ (maybe you meant to use ‘->’ ?)
    src/../inc/ConstructableJson.hpp: In instantiation of ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’:
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/bits/range_access.h:48:5: note: candidate: template<class _Container> decltype (__cont.begin()) std::begin(_Container&)
    begin(_Container& __cont) -> decltype(__cont.begin())
    ^
    /usr/include/c++/5/bits/range_access.h:48:5: note: template argument deduction/substitution failed:
    /usr/include/c++/5/bits/range_access.h: In substitution of ‘template<class _Container> decltype (__cont.begin()) std::begin(_Container&) [with _Container = std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*]’:
    src/../inc/ConstructableJson.hpp:23:3: required from ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/bits/range_access.h:48:5: error: request for member ‘begin’ in ‘__cont’, which is of pointer type ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*’ (maybe you meant to use ‘->’ ?)
    In file included from /usr/include/c++/5/bits/range_access.h:36:0,
    from /usr/include/c++/5/string:51,
    from /usr/include/c++/5/bits/locale_classes.h:40,
    from /usr/include/c++/5/bits/ios_base.h:41,
    from /usr/include/c++/5/ios:42,
    from /usr/include/c++/5/ostream:38,
    from /usr/include/c++/5/iostream:39,
    from src/../inc/Tile.hpp:4,
    from src/Tile.cpp:1:
    src/../inc/ConstructableJson.hpp: In instantiation of ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’:
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/initializer_list:89:5: note: candidate: template<class _Tp> constexpr const _Tp* std::begin(std::initializer_list<_Tp>)
    begin(initializer_list<_Tp> __ils) noexcept
    ^
    /usr/include/c++/5/initializer_list:89:5: note: template argument deduction/substitution failed:
    In file included from src/../inc/Tile.hpp:8:0,
    from src/Tile.cpp:1:
    src/../inc/ConstructableJson.hpp:23:3: note: mismatched types ‘std::initializer_list<_Tp>’ and ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*’
    for (auto obj : list()) {
    ^
    src/../inc/ConstructableJson.hpp:23:3: error: no matching function for call to ‘end(std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*&)’
    In file included from /usr/include/c++/5/string:51:0,
    from /usr/include/c++/5/bits/locale_classes.h:40,
    from /usr/include/c++/5/bits/ios_base.h:41,
    from /usr/include/c++/5/ios:42,
    from /usr/include/c++/5/ostream:38,
    from /usr/include/c++/5/iostream:39,
    from src/../inc/Tile.hpp:4,
    from src/Tile.cpp:1:
    /usr/include/c++/5/bits/range_access.h:97:5: note: candidate: template<class _Tp, long unsigned int _Nm> _Tp* std::end(_Tp (&)[_Nm])
    end(_Tp (&__arr)[_Nm])
    ^
    /usr/include/c++/5/bits/range_access.h:97:5: note: template argument deduction/substitution failed:
    In file included from src/../inc/Tile.hpp:8:0,
    from src/Tile.cpp:1:
    src/../inc/ConstructableJson.hpp:23:3: note: mismatched types ‘_Tp [_Nm]’ and ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*’
    for (auto obj : list()) {
    ^
    In file included from /usr/include/c++/5/string:51:0,
    from /usr/include/c++/5/bits/locale_classes.h:40,
    from /usr/include/c++/5/bits/ios_base.h:41,
    from /usr/include/c++/5/ios:42,
    from /usr/include/c++/5/ostream:38,
    from /usr/include/c++/5/iostream:39,
    from src/../inc/Tile.hpp:4,
    from src/Tile.cpp:1:
    /usr/include/c++/5/bits/range_access.h:78:5: note: candidate: template<class _Container> decltype (__cont.end()) std::end(const _Container&)
    end(const _Container& __cont) -> decltype(__cont.end())
    ^
    /usr/include/c++/5/bits/range_access.h:78:5: note: template argument deduction/substitution failed:
    /usr/include/c++/5/bits/range_access.h: In substitution of ‘template<class _Container> decltype (__cont.end()) std::end(const _Container&) [with _Container = std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*]’:
    src/../inc/ConstructableJson.hpp:23:3: required from ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/bits/range_access.h:78:5: error: request for member ‘end’ in ‘__cont’, which is of pointer type ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >* const’ (maybe you meant to use ‘->’ ?)
    src/../inc/ConstructableJson.hpp: In instantiation of ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’:
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/bits/range_access.h:68:5: note: candidate: template<class _Container> decltype (__cont.end()) std::end(_Container&)
    end(_Container& __cont) -> decltype(__cont.end())
    ^
    /usr/include/c++/5/bits/range_access.h:68:5: note: template argument deduction/substitution failed:
    /usr/include/c++/5/bits/range_access.h: In substitution of ‘template<class _Container> decltype (__cont.end()) std::end(_Container&) [with _Container = std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*]’:
    src/../inc/ConstructableJson.hpp:23:3: required from ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/bits/range_access.h:68:5: error: request for member ‘end’ in ‘__cont’, which is of pointer type ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*’ (maybe you meant to use ‘->’ ?)
    In file included from /usr/include/c++/5/bits/range_access.h:36:0,
    from /usr/include/c++/5/string:51,
    from /usr/include/c++/5/bits/locale_classes.h:40,
    from /usr/include/c++/5/bits/ios_base.h:41,
    from /usr/include/c++/5/ios:42,
    from /usr/include/c++/5/ostream:38,
    from /usr/include/c++/5/iostream:39,
    from src/../inc/Tile.hpp:4,
    from src/Tile.cpp:1:
    src/../inc/ConstructableJson.hpp: In instantiation of ‘ConstructableJsonHolder<T>::~ConstructableJsonHolder() [with T = Tile]’:
    src/Tile.cpp:4:12: required from here
    /usr/include/c++/5/initializer_list:99:5: note: candidate: template<class _Tp> constexpr const _Tp* std::end(std::initializer_list<_Tp>)
    end(initializer_list<_Tp> __ils) noexcept
    ^
    /usr/include/c++/5/initializer_list:99:5: note: template argument deduction/substitution failed:
    In file included from src/../inc/Tile.hpp:8:0,
    from src/Tile.cpp:1:
    src/../inc/ConstructableJson.hpp:23:3: note: mismatched types ‘std::initializer_list<_Tp>’ and ‘std::map<std::__cxx11::basic_string<char>, Tile*, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, Tile*> > >*’
    for (auto obj : list()) {
    ^
    makefile:13*: la recette pour la cible «*obj/Tile.o*» a échouée
    make: *** [obj/Tile.o] Erreur 1
    Merci de votre aide !

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Ça dit qu'il n'y a pas de fonction begin/end pour un pointeur. Pourquoi list() ne retourne pas une référence ? Au passage mettre le statique dans la fonction list() serait beaucoup plus facile.

    Mais ce qui me choque vraiment est
    1 - d'utiliser un membre statique alors que celui-ci semble être détruit par une instance ConstructableJsonHolder. Pourquoi ne pas le mettre en membre ?
    2 - s'occuper de détruire manuelle les pointeurs alors qu'il existe std::unique_ptr.

Discussions similaires

  1. [Bing] Pointeur sur une map
    Par eno97 dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 28/06/2015, 09h48
  2. [C++] pointeur sur une classe
    Par PH69 dans le forum Débuter
    Réponses: 1
    Dernier message: 21/11/2005, 22h08
  3. Réponses: 14
    Dernier message: 14/03/2005, 09h16
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo