boost::interprocess::map вставка дает: неоднозначный вызов перегруженной функции

Я пытаюсь вставить некоторые значения в boost::interprocess::map, хранящиеся в общей памяти.

Проблема в том, что он дает мне «неоднозначный вызов перегруженной функции», когда я пытаюсь его скомпилировать, и я не знаю, почему. Вот несколько фрагментов кода:

#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>

typedef char * KeyType;
typedef long  ValueType;
typedef std::pair<const char *, long> Type_Value;

typedef boost::interprocess::allocator<Type_Value, boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocator;
typedef boost::interprocess::map<KeyType, ValueType, std::less<KeyType>, ShmemAllocator> MyMap;


...

MyMap * myMap = segment.construct<MyMap>("CyValoresRTD")      //object name
                         (std::less<char *>() //first  ctor parameter
                         ,alloc_inst);     //second ctor parameter

...
char * text = "some text";
long value = 1234;
myMap->insert( std::make_pair(text, value) );

Этот вызов вставки дает мне некоторые ошибки:

vcrtdserverimpl.cpp(445) : error C2668: 'boost::interprocess_container::map<Key,T,Pred,Alloc>::insert' : ambiguous call to overloaded function
with
[
        Key=VCRTDServer::KeyType,
        T=VCRTDServer::ValueType,
        Pred=std::less<VCRTDServer::KeyType>,
        Alloc=VCRTDServer::ShmemAllocator
]
p:\lib\boost_1_39_0\boost\interprocess\containers\container\map.hpp(407): could be 'std::pair<_Ty1,_Ty2> boost::interprocess_container::map<Key,T,Pred,Alloc>::insert(const std::pair<char *,long> &)'
with
[
        _Ty1=boost::interprocess_container::containers_detail::rbtree<VCRTDServer::KeyType ,std::pair<const VCRTDServer::KeyType ,VCRTDServer::ValueType>,boost::interprocess_container::containers_detail::select1st<std::pair<const VCRTDServer::KeyType ,VCRTDServer::ValueType>>,std::less<VCRTDServer::KeyType>,VCRTDServer::ShmemAllocator>::iterator,
        _Ty2=bool,
        Key=VCRTDServer::KeyType,
        T=VCRTDServer::ValueType,
        Pred=std::less<VCRTDServer::KeyType>,
        Alloc=VCRTDServer::ShmemAllocator
]
p:\lib\boost_1_39_0\boost\interprocess\containers\container\map.hpp(396): or       'std::pair<_Ty1,_Ty2> boost::interprocess_container::map<Key,T,Pred,Alloc>::insert(const std::pair<const Key,T> &)'
with
[
        _Ty1=boost::interprocess_container::containers_detail::rbtree<VCRTDServer::KeyType ,std::pair<const VCRTDServer::KeyType ,VCRTDServer::ValueType>,boost::interprocess_container::containers_detail::select1st<std::pair<const VCRTDServer::KeyType ,VCRTDServer::ValueType>>,std::less<VCRTDServer::KeyType>,VCRTDServer::ShmemAllocator>::iterator,
        _Ty2=bool,
        Key=VCRTDServer::KeyType,
        T=VCRTDServer::ValueType,
        Pred=std::less<VCRTDServer::KeyType>,
        Alloc=VCRTDServer::ShmemAllocator
]
while trying to match the argument list '(std::pair<_Ty1,_Ty2>)'
with
[
        _Ty1=char *,
        _Ty2=int
]

У кого-нибудь есть идеи?


person George Ferreira    schedule 18.06.2012    source источник
comment
Не уверен, связано ли это с вашей проблемой, но настоящий value_type из map<char*, long> — это pair<char* const, long>, а не pair<char const*, long>. т.е. ваш Type_Value typedef неверен.   -  person ildjarn    schedule 19.06.2012
comment
Спасибо за совет! К сожалению, проблема была не в этом. знак равно   -  person George Ferreira    schedule 19.06.2012


Ответы (1)


Сообщение об ошибке сообщает вам о проблеме.

could be ...
::insert(const std::pair<char *,long> &)'

or ....
::insert(const std::pair<const Key,T> &)'

 while trying to match the argument list '(std::pair<_Ty1,_Ty2>)'
            with
            [
                    _Ty1=char *,
                    _Ty2=int
            ]

Ключи std::map константны, как и пары для вставки. Вероятно, вам лучше использовать std::string в качестве ключа.

person Tom Kerr    schedule 18.06.2012
comment
Большое спасибо! Это сделало трюк! Использование std::string разрешило это. - person George Ferreira; 19.06.2012