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 !