2014-11-21 41 views
2

我嘗試從我的結構體(struct pnt)的向量打印一個結構體成員。讓我清楚通過顯示此:一個向量結構的打印成員

struct pnt { 
    char _name; 
    int _type; 
    bool _aux; 
    }; 

boost::copy(pntVec.begin(),pntVec.end()| 
boost::adaptors::transformed(bind(&pnt::_type, _1)), 
std::ostream_iterator<int>(std::cout, "\n")); 

但我得到一個錯誤。如果你能幫我找到原因,我將不勝感激。

錯誤

error: no type named ‘type’ in ‘boost::mpl::eval_if_c<true, boost::range_const_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> >, void>, boost::range_mutable_iterator<const __gnu_cxx::__normal_iterator<int*, std::vector<int> >, void> >::f_ {aka struct boost::range_const_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> >, void>}’ 

:我可以olny使用C++ 98,升壓v.1.56

+3

_ 「我得到一個錯誤」 _。請包括您在問題中得到的確切錯誤消息。 – Michael 2014-11-21 11:37:21

+0

錯誤已添加 – 2014-11-21 11:40:05

+2

@ H'H您的意思是'boost :: copy(pntVec | boost :: adapters :: transformed(bind(&pnt :: _ type,_1)),std :: ostream_iterator (std :: cout ,「\ n」));'? – 2014-11-21 11:43:23

回答

3

升壓適配器適應範圍,不是單一迭代器。類似地,boost::copy算法期望兩個參數,其中第一個參數是範圍,第二個參數是輸出迭代器。話雖如此,從一範圍提取單個數據成員,並將其複製到輸出迭代器的正確的語法是:

boost::copy(pntVec | boost::adaptors::transformed(bind(&pnt::_type, _1)) 
      , std::ostream_iterator<int>(std::cout, "\n")); 
3

另外,由於鳳凰衛視在某種程度上取代了Boost Bind +升壓LAMBDA,你可以使用boost鳳凰:

boost::for_each(pntVec, std::cout << bind(&pnt::_type, arg1) << "\n"); 

甚至沒有bind,如果你不擔心有點神祕的語法:

boost::for_each(v, std::cout << (arg1->*&pnt::_type) << "\n"); 

這很漂亮。看到它Live On Coliru


另外,還要注意有一個在升壓/ C++ 11 mem_fnpntVec | transformed(mem_fn(&pnt::_type))

+0

添加了[成員指針操作符](http:// www.boost.org/doc/libs/1_57_0/libs/phoenix/doc/html/phoenix/modules/operator.html#phoenix.modules.operator.member_pointer_operator)完整性的語法變體 – sehe 2014-11-21 12:23:28