pb: "passage" d'une std::map à une method dans une lib externe
Bonjour
mon problème est le suivant:
Quand je crée une std::map dans un executable, et que je la passe (par valeur ou référence) à une méthode d'un objet compilé dans une DLL externe, je n'arrive pas à accéder à tous les élements de la map (ça plante à partir du deuxième).
Voila un bout de code minimal qui illustre mon pb:
main.cpp: l'"application".
dll.h et dll.cpp : la dll qui contient l'objet et la méthode en question
main.cpp___________________________
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #pragma warning( disable: 4786 )
#include <map>
#include <iostream>
#include <string>
#include "dll.h"
int main ()
{
std::map<const std::string, std::string> l_map;
std::map<const std::string, std::string>::iterator it;
int i;
l_map["1"] = "2";
l_map["3"] = "4";
l_map["5"] = "6";
for (it = l_map.begin(); it != l_map.end(); it++)
{
std::cout << (*it).first << ": " << (*it).second << "\n";
} // là, tout s'affiche bien.
CDll obj;
obj.f(l_map);
std::cin >> i;
return 0;
} |
dll.h________________________________________
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #pragma warning( disable: 4786 )
#include <map>
#include <iostream>
#include <string>
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
class DLL_API CDll
{
public:
void f(std::map<const std::string, std::string>& p_map);
}; |
dll.cpp________________________
Code:
1 2 3 4 5 6 7 8 9 10 11
| #include "dll.h"
void CDll::f(std::map<const std::string, std::string>& p_map)
{
std::map<const std::string, std::string>::iterator it;
for (it = p_map.begin(); it != p_map.end(); it++)
{
std::cout << "DLL: " <<(*it).first << ": " << (*it).second << "\n";
} // là, ça plante au deuxième passage
} |
Le même code tout dans un exe ne pose pas de problème.
Une idée?
Merci d'avance.
il semble que le pb vienne de map
Bonjour encore ;-)
un bout de "solution"
il semblerait que le pb concerne seulement les map (j'ai pas essayé les list)
si on passe un vector de pair de string (vector<pair<string, string> > ça marche.
On perd alors les aventages de tri de la map, mais comme dans mon cas je me'en fiche (ouf ;-) ) ça marche.
Mais bon, ça ne résoud pas vraiment ce pb.
Peut etre que ça vient de l'implémentation de la stl map de microsoft visual 6.
J'ai pas encore essayé avec d'autres compilateur...