Boost logo

Boost Users :

Subject: [Boost-users] boost::interprocess map: no appropriate default constructor compile error
From: Chris Miclea (ChMiclea_at_[hidden])
Date: 2010-03-22 15:43:24


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::clientDat
aServer::Data>,

 
SegmentManager=boost::interprocess::segment_manager<char,boost::interpro
cess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interpro
cess::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::clientDat
aServer::Data>,

 
SegmentManager=boost::interprocess::segment_manager<char,boost::interpro
cess::rbtree_best_fit<boost::interprocess::mutex_family>,boost::interpro
cess::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

 



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net