Hello,

 

I have a problem when compiling code using boost::interprocess library code.

I've run into a compile error while trying to create a map in a boost shared memory object. I am using the VisualStudio2005 C++ compiler, and boost 1.38.

 

The symptom is:

C:\svn\ThirdPartySDK\boost_1_38_0\boost/interprocess/containers/map.hpp(140) : error C2512: 'boost::interprocess::allocator<T,SegmentManager>::allocator' : no appropriate default constructor available

        with

        [

            T=std::pair<sage::lib::clientDataServer::MapKey<10>,sage::lib::clientDataServer::Data>,

            SegmentManager=boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>

        ]

 

Quick description - code is attached below:

templated class ReadOnlyCatalog, taking an int template LENGTH and a template parm class T (T is the mapped data, or "second" in the pair).

the map index is a templated class called MapKey, taking an int LENGTH.

templated class MapKeyLess to provide the less() operator for the map index.

 

Can anyone tell why am I getting the compiler error?

Your help is greatly appreciated.

 

 

template <int LENGTH, class T>

class ReadOnlyCatalog

{

public:

    typedef std::pair<MapKey<LENGTH>, T> Value_t;

    typedef boost::interprocess::allocator<Value_t, boost::interprocess::managed_shared_memory::segment_manager> Allocator_t;

    typedef boost::interprocess::map<MapKey<LENGTH>,

                                     T,

                                     MapKeyLess<LENGTH>,

                                     Allocator_t> Map_t;

    ReadOnlyCatalog()     { ...  }

    ReadOnlyCatalog( const RoShMemType_e in_type, const std::string& in_segName, const std::string& in_objName )    { ...   }

};

 

const int OrderTypeKeyLength = 10;

 

class Data

{

public:

    Data()     { ...  };

}

 

template <int LENGTH>

class MapKey

{

public:

    MapKey()     { ..  }

    MapKey( const std::string& in_key )    { ...  }

public:

    char m_key[LENGTH + 1];

};

 

 

template <int LENGTH>

class MapKeyLess

{

public:

    bool operator()( const MapKey<LENGTH>& a, const MapKey<LENGTH>& b ) const

    {

        return strncmp( a.m_key, b.m_key, LENGTH ) < 0;

    }

};

 

 

// instantiate ReadOnlyCatalog template;

class OrderTypeCatalog : public ReadOnlyCatalog<OrderTypeKeyLength, Data>

{

public:

    OrderTypeCatalog() {}

    OrderTypeCatalog( const RoShMemType_e in_type, const std::string& in_segName, const std::string& in_objName ) :

        ReadOnlyCatalog( in_type, in_segName, in_objName ) {};

};

 

 

// a use of OrderTypeCatalog

class X

{

public:

    X()

    {

        ptr = new OrderTypeCatalog( in_type, "aaa", "bbb" );

    }

 

private:

    OrderTypeCatalog*  ptr;

};

 

 

Included headers:

#include <boost/interprocess/shared_memory_object.hpp>

#include <boost/interprocess/mapped_region.hpp>

#include <boost/interprocess/managed_shared_memory.hpp>

#include <boost/interprocess/containers/vector.hpp>

#include <boost/interprocess/containers/map.hpp>

#include <boost/interprocess/allocators/allocator.hpp>

 

 

Full compiler error message:

 

C:\svn\ThirdPartySDK\boost_1_38_0\boost/interprocess/containers/map.hpp(140) : error C2512: 'boost::interprocess::allocator<T,SegmentManager>::allocator' : no appropriate default constructor available

        with

        [

            T=std::pair<sage::lib::clientDataServer::MapKey<10>,sage::lib::clientDataServer::Data>,

            SegmentManager=boost::interprocess::segment_manager<char,boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interprocess::iset_index>

        ]

        C:\svn\Projects\trunk\Lib/ClientDataServer/ReadOnlySegments.h(166) : while compiling class template member function 'sage::lib::clientDataServer::ReadOnlyCatalog<LENGTH,T>::ReadOnlyCatalog(void)'

        with

        [

            LENGTH=10,

            T=sage::lib::clientDataServer::Data

        ]

        C:\svn\Projects\trunk\Lib/CLientDataServer/ReadOnlyShMem.h(25) : see reference to class template instantiation 'sage::lib::clientDataServer::ReadOnlyCatalog<LENGTH,T>' being compiled

        with

        [

            LENGTH=10,

            T=sage::lib::clientDataServer::Data

        ]

 

Regards,

Chris Miclea