创建内存分配器时C ++继承错误

时间:2012-10-24 14:26:32

标签: c++ memory-management boost stl ipc

我想知道为什么以下代码不起作用。 其背后的主要思想如下:

  1. 我想使用分别由std allocator和boost :: interprocess :: allocator继承的自定义类,我想用它们代替基本分配器
  2. 当我创建一个MyStdAllocator类时,它继承std :: allocator并使用它而不是std :: allocator(参见变量x1和x2),它可以工作并且不会发出警告而且没有错误。
  3. 当我创建一个类MyBoostAllocator,它继承了boost :: interprocess :: allocator并使用它而不是boost :: interprocess:allocator(参见变量y1和y2)它不起作用并且给我列出的编译错误这个问题的底部。
  4. 请你告诉我,为什么这样的继承不起作用以及如何修复它?

    #include <boost/interprocess/managed_shared_memory.hpp>
    #include <boost/interprocess/allocators/allocator.hpp>
    #include <iostream>
    
    using namespace boost::interprocess;
    
    
    template <typename _Tp>
    class MyStdAllocator : public std::allocator<_Tp>
    {
    };
    
    
    template<class T, class SegmentManager>
    class MyBoostAllocator : public allocator<T, SegmentManager>
    {
    };
    
    
    
    typedef std::allocator<int> std_allocator;
    typedef MyStdAllocator<int> my_std_allocator;
    
    typedef allocator       <int, managed_shared_memory::segment_manager> boost_allocator;
    typedef MyBoostAllocator<int, managed_shared_memory::segment_manager> my_boost_allocator;
    
    
    int main(int argc, char** argv) {
    
        struct shm_remove {
            shm_remove() {
                shared_memory_object::remove("MySharedMemory");
            }
    
            ~shm_remove() {
                shared_memory_object::remove("MySharedMemory");
            }
        } remover;
    
        managed_shared_memory segment(create_only,
                "MySharedMemory", //segment name
                65536);
    
        //Create an allocator that allocates ints from the managed segment
        allocator<int, managed_shared_memory::segment_manager>
                allocator_instance(segment.get_segment_manager());
    
    
        std_allocator *x1;
        x1 = new std_allocator();
        delete x1;
    
        my_std_allocator *x2;
        x2 = new my_std_allocator();
        delete x2;
    
    
        boost_allocator *y1;
        y1 = new boost_allocator(segment.get_segment_manager());
        delete y1;
    
        // following lines generate compilation errors:
        my_boost_allocator *y2;
        y2 = new my_boost_allocator(segment.get_segment_manager());
        delete y2;
    
        std::cout<<"its working!\n";
    
        return 0;
    
    }
    

    编译错误如下:

    ../src/test.cpp:73:59: error: no matching function for call to ‘MyBoostAllocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >::MyBoostAllocator(boost::interprocess::ipcdetail::basic_managed_memory_impl<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index, 16ul>::segment_manager*)’
    ../src/test.cpp:73:59: note: candidates are:
    ../src/test.cpp:24:7: note: MyBoostAllocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >::MyBoostAllocator()
    ../src/test.cpp:24:7: note:   candidate expects 0 arguments, 1 provided
    ../src/test.cpp:24:7: note: MyBoostAllocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >::MyBoostAllocator(const MyBoostAllocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >&)
    ../src/test.cpp:24:7: note:   no known conversion for argument 1 from ‘boost::interprocess::ipcdetail::basic_managed_memory_impl<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index, 16ul>::segment_manager* {aka boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index>*}’ to ‘const MyBoostAllocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >&’
    make: *** [src/test.o] Error 1
    

1 个答案:

答案 0 :(得分:1)

这似乎是一个“支持的C ++ 11”问题。见

http://wiki.apache.org/stdcxx/C++0xCompilerSupport

哪些编译器支持哪些功能。

Inheriting constructors仅限gnu4.8 +。

如果他们仍然需要明确地使用使用结构。

template<class T, class SegmentManager> 
class MyBoostAllocator : public allocator<T, SegmentManager> 
{ 
 public:
     using allocator<T, SegmentManager >::allocator;
};  

在此之前,请在派生类中编写构造函数。