2011-12-14 2 views
4

J'ai le code suivant qui enregistre une carte en mémoire partagée à l'aide boost interprocessusboost carte interprocessus avec int et string

using namespace boost::interprocess; 
//Shared memory front-end that is able to construct objects 
//associated with a c-string. Erase previous shared memory with the name 
//to be used and create the memory segment at the specified address and initialize resources 
shared_memory_object::remove("MySharedMemory"); 

try{ 
    managed_shared_memory segment 
     (create_only 
     ,"MySharedMemory" //segment name 
     ,655360);   //segment size in bytes 

    //Note that map<Key, MappedType>'s value_type is std::pair<const Key, MappedType>, 
    //so the allocator must allocate that pair. 
    typedef allocator<char, managed_shared_memory::segment_manager> CharAllocator; 
    typedef basic_string<char, std::char_traits<char> ,CharAllocator> MyShmString; 
    typedef allocator<MyShmString, managed_shared_memory::segment_manager> StringAllocator; 

    typedef int KeyType; 
    typedef std::pair<const int, StringAllocator> ValueType; 
    typedef StringAllocator MappedType; 

    typedef allocator<ValueType, managed_shared_memory::segment_manager> ShmemAllocator; 

    typedef map<KeyType, MappedType, std::less<KeyType>, ShmemAllocator> MyMap; 

    //Initialize the shared memory STL-compatible allocator 
    ShmemAllocator alloc_inst (segment.get_segment_manager()); 
    CharAllocator charallocator (segment.get_segment_manager()); 


    //Construct a shared memory map. 
    //Note that the first parameter is the comparison function, 
    //and the second one the allocator. 
    //This the same signature as std::map's constructor taking an allocator 
    MyMap *mymap = 
     segment.construct<MyMap>("MyMap")  //object name 
     (std::less<int>() //first ctor parameter 
     ,alloc_inst);  //second ctor parameter 

    //Insert data in the map 
    MyShmString mystring(charallocator); 
    mystring = "this is my text"; 
    for(int i = 0; i < 100; ++i){ 
     //mymap[i] = mystring; 
     mymap->insert(std::pair<const int, MappedType>(i, mystring)); 
    } 
} 

ce ne marche pas de code compilation .. il jette l'erreur suivante

no matching function for call to ‘std::pair<const int, boost::interprocess::allocator<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >::pair(int&, main()::MyShmString&)’ 
    /usr/include/c++/4.2.1/bits/stl_pair.h:84: note: candidates are: std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = const int, _T2 = boost::interprocess::allocator<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> >] 
    /usr/include/c++/4.2.1/bits/stl_pair.h:80: note:     std::pair<_T1, _T2>::pair() [with _T1 = const int, _T2 = boost::interprocess::allocator<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> >] 
    /usr/include/c++/4.2.1/bits/stl_pair.h:69: note:     std::pair<const int, boost::interprocess::allocator<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >::pair(const std::pair<const int, boost::interprocess::allocator<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> > >&) 

la différence si

::pair(int&, main()::MyShmString&) 

donc je suis devinant

  mymap->insert(std::pair<const int, MappedType>(i, mystring)); 

n'est pas la bonne façon de procéder .. alors comment dois-je insérer dans la carte, si l'erreur est là .. sinon quelle est l'erreur?

+0

Votre typedefs sont très confus. Vous devriez nettoyer ça. Par exemple, pourquoi définissez-vous un 'ValueType' si' map' a déjà un tel typedef ('std :: map :: value_type')? –

Répondre

4

Sûrement le value_type est:

typedef std::pair<const int, MyShmString > ValueType; 

pas

typedef std::pair<const int, StringAllocator> ValueType; 

Et de même:

typedef MyShmString MappedType; 

pas

typedef StringAllocator MappedType; 
1

Vos types sont différents, est-ce intentionnel? MyShmString n'est pas la même chose que MappedType - peut-être vous devez changer la ligne suivante:

typedef StringAllocator MappedType; 

à

typedef MyShmString MappedType; 
Questions connexes