LINUX.ORG.RU

Не компилируется std::not1(boost::mem_fn(...))


0

0

#include <typeinfo>
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <boost/shared_ptr.hpp>
#include <boost/mem_fn.hpp>
#include <boost/functional.hpp>

class Item_t
{
private:
	int m_ival;
public:
	typedef boost::shared_ptr<Item_t> sptr_t;
	int GetIval() { return m_ival; }
	Item_t(int ival):m_ival(ival) {}
	template<int ival> bool IvalLt() { return m_ival < ival; }
	void print() { std::cout << m_ival << std::endl; }

	template<int ival> static bool st_IvalLt(Item_t::sptr_t sptr) { return sptr->GetIval() < ival; }
};

int main(void)
{
	std::vector<Item_t::sptr_t> items;
	std::vector<Item_t::sptr_t>::iterator el;

	items.push_back(Item_t::sptr_t(new Item_t(10)));
	items.push_back(Item_t::sptr_t(new Item_t(5)));
	items.push_back(Item_t::sptr_t(new Item_t(30)));
	items.push_back(Item_t::sptr_t(new Item_t(20)));

	// работает
	el = find_if(items.begin(), items.end(), boost::mem_fn(&Item_t::IvalLt<7>));
	if(el != items.end())
		(*el)->print();

	// не компилируется
	el = find_if( items.begin(), items.end(), std::not1(boost::mem_fn(&Item_t::IvalLt<25>)) );
	if(el != items.end())
		(*el)->print();

	// работает
	el = find_if( items.begin(), items.end(), std::not1(std::ptr_fun(&Item_t::st_IvalLt<30>)) );
	if(el != items.end())
		(*el)->print();

	std::vector<Item_t*> items_p;
	items_p.push_back(new Item_t(5));
	items_p.push_back(new Item_t(10));

	// работает
	std::vector<Item_t*>::iterator el_p = 
		find_if( items_p.begin(), items_p.end(), std::not1(boost::mem_fn(&Item_t::IvalLt<7>)) );
	if(el_p != items_p.end())
		(*el_p)->print();
}

Пишет:
stl_algo.h:259: error: no match for call to 
`(std::unary_negate<boost::_mfi::mf0<bool, Item_t> >) 
(boost::shared_ptr<Item_t>&)'
stl_function.h:323: note: candidates are: bool 
std::unary_negate<_Predicate>::operator()(const typename 
_Predicate::argument_type&) const [with _Predicate = 
boost::_mfi::mf0<bool, Item_t>]

Если написать, boost::not1, то тоже не компилируется.

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.