boost.multi_index & IPC

typedef managed_shared_memory::allocator<char>::type char_allocator; typedef basic_string<char, std::char_traits<char>, char_allocator>shm_string; struct quote { public: int market; int kind; shm_string seccode; shm_string secname; float price; float zf; quote(int market_, int kind_, const char* seccode_, const char_allocator& a, const char* secname_, const char_allocator& b, float price_, float zf_): market(market_),kind(kind_), seccode(seccode_, a), secname(secname_, b), price(price_), zf(zf_) {} }; typedef boost::multi_index::composite_key<quote, BOOST_MULTI_INDEX_MEMBER(quote, int, market), BOOST_MULTI_INDEX_MEMBER(quote, shm_string, seccode)
comp_key_search; typedef boost::multi_index::composite_key_compare< std::greater<int>, std::greater<shm_string> comp_key_compare_search;
typedef boost::multi_index::composite_key<quote, BOOST_MULTI_INDEX_MEMBER(quote, float, price), BOOST_MULTI_INDEX_MEMBER(quote, int, market), BOOST_MULTI_INDEX_MEMBER(quote, shm_string, seccode)
comp_key_sortbyprice; typedef boost::multi_index::composite_key_compare< std::greater<float>, std::greater<int>, std::greater<shm_string> comp_key_compare_sortbyprice;
typedef boost::multi_index::multi_index_container< quote, boost::multi_index::indexed_by< boost::multi_index::ordered_non_unique<comp_key_search, comp_key_compare_search>, boost::multi_index::ordered_non_unique<comp_key_sortbyprice, comp_key_compare_sortbyprice> >, managed_shared_memory::allocator<quote>::type
quote_mic;
int main() { /* struct shm_remove { shm_remove() { shared_memory_object::remove("MySharedMemory"); } ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); } } remover; */ managed_shared_memory segment(open_only,"MySharedMemory"); quote_mic *quotes = segment.find_or_construct<quote_mic> ("My MultiIndex Container") //Container's name in shared memory ( quote_mic::ctor_args_list(), //, segment.get_allocator<quote>()); //Ctor parameters quote_mic::allocator_type(segment.get_segment_manager())); quote_mic::nth_index<0>::type& idx_search = quotes->get<0>(); quote_mic::nth_index<1>::type& idx_sortbyprice = quotes->get<1>(); int count = 0; char_allocator ca1(segment.get_allocator<char>()); // 查询股票实时行情 shm_string seccode("600000", ca1); count = idx_search.count(boost::tuples::make_tuple(1, seccode)); quote_mic::nth_index<0>::type::iterator it = idx_search.find(boost::tuples::make_tuple(1, seccode)); for (int i=0; i<count; i++) { std::cout << it->seccode << std::endl; it++; } std::vector<quote> result; BOOST_FOREACH(const quote& q, idx_sortbyprice) { int kind = q.kind; if (kind == 1 || kind == 11) { // std::cout << "市场" << q.market << ",类别" << q.kind << ", " << q.secname << ",最新价" << q.price << std::endl; result.push_back(q); this statement will compile error, why? how to write? } else { // std::cout << "过滤:市场" << q.market << ",类别" << q.kind << ", " << q.secname << ",最新价" << q.price << std::endl; } } return 0; }

陈海峰 <chenhf2010 <at> qq.com> writes:
std::vector<quote> result;
BOOST_FOREACH(const quote& q, idx_sortbyprice)
{
int kind = q.kind;
if (kind == 1 || kind == 11)
{ // std::cout << "市场" << q.market << ",类别" << q.kind << >
", " << q.secname << ",最新价" << q.price << std::endl;
result.push_back(q); this statement will compile error, why? how to write?
Can you post the exact compiler error you're getting. Thank you, Joaquín M López Muñoz Telefónica Digital

On Mon, 09 Apr 2012 14:44:10 +0200, 陈海峰 <chenhf2010@qq.com> wrote:
struct quote { public: int market; int kind; shm_string seccode; shm_string secname; float price; float zf;
quote(int market_, int kind_, const char* seccode_, const char_allocator& a, const char* secname_, const char_allocator& b, float price_, float zf_): market(market_),kind(kind_), seccode(seccode_, a), secname(secname_, b), price(price_), zf(zf_) {} };
std::vector<quote> result; result.push_back(q); this statement will compile error, why? how to
Unless I miss something in modern STL, you need copy constructor for quote.

<Viatcheslav.Sysoltsev <at> h-d-gmbh.de> writes:
On Mon, 09 Apr 2012 14:44:10 +0200, 陈海峰 <chenhf2010 <at> qq.com> wrote:
std::vector<quote> result; result.push_back(q); this statement will compile error, > >
why? how to
Unless I miss something in modern STL, you need copy constructor for quote.
The ctor is generated automitically unless ome of the members are not copyable. The only suspicious guy here is shm_string. But having the compiler error would saves us some wild guessing. Joaquín M López Muñoz Telefónica Digital
participants (3)
-
Joaquín M López Muñoz
-
Viatcheslav.Sysoltsev@h-d-gmbh.de
-
陈海峰