2016-01-16 34 views
1

我試圖創建一個使用this答案的內存映射文件,但我得到編譯錯誤。這是我的代碼:C++:Boost進程間內存映射文件錯誤

namespace bi = boost::interprocess; 
std::string vecFile = "vector.dat"; 
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), sizeof(struct Rectangle) * data_size); 

typedef bi::allocator<struct Rectangle, bi::managed_mapped_file::segment_manager> rect_alloc; 
typedef std::vector<struct Rectangle, rect_alloc> MyVec; 

MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(file_vec.get_segment_manager()); 

vecptr->push_back(random_rectangle); 

的結構是這樣的:

struct Rectangle{ 

    Rectangle(float *minArr, float *maxArr, int arr, int exp, int ID){ 
    this->arrival = arr; 
    this->expiry = exp; 
    this->id = ID; 
    for(int i=0; i < 2; i++){ 
     min[i] = minArr[i]; 
     max[i] = maxArr[i]; 
    } 

    int arrival, expiry, id; 
    float min[2]; 
    float max[2]; 
} 

我得到的錯誤是:編譯器無法推斷出模板參數從「升壓::進程間「_Ty *」 :: offset_ptr」。我究竟做錯了什麼?

+0

在不需要的情況下使用原始指針和'struct Rectangle'指示C編程風格。看到我的答案几個現代化。然而,更重要的是如何創建一個[SSCCE](http://sscce.org)。 – sehe

回答

1

它看起來好對我說:

Live On Coliru

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

namespace bi = boost::interprocess; 

struct Rectangle { 
    Rectangle(float *minArr, float *maxArr, int arr, int exp, int ID) { 
     this->arrival = arr; 
     this->expiry = exp; 
     this->id = ID; 
     for (int i = 0; i < 2; i++) { 
      min[i] = minArr[i]; 
      max[i] = maxArr[i]; 
     } 
    }; 

    int arrival, expiry, id; 
    float min[2]; 
    float max[2]; 
}; 

namespace Shared { 
    using segment = bi::managed_mapped_file; 
    using mgr  = segment::segment_manager; 

    using alloc = bi::allocator<Rectangle, mgr>; 
    using vector = std::vector<Rectangle, alloc>; 
} 

Rectangle random_rectangle() { 
    float dummy[2] = { }; 
    return { dummy, dummy, 0, 0, 0 }; 
} 

int main() { 
#define data_size 10 
    std::string vecFile = "vector.dat"; 
    Shared::segment mmem(bi::open_or_create, vecFile.c_str(), (10u<<10) + sizeof(struct Rectangle) * data_size); 

    Shared::vector *vecptr = mmem.find_or_construct<Shared::vector>("myvector")(mmem.get_segment_manager()); 

    vecptr->push_back(random_rectangle()); 
} 

如果不按上述確切編譯,請注意您的庫和編譯器的版本。考慮升級。

+0

感謝您的回答!看起來它實際上是一個編譯器或Boost相關的錯誤。我目前正在更新這些庫。 – TheShadow