2010-01-16 2 views
4

벡터에서 짧은 문자열을 제거하려고합니다.boost :: bind를 통해 벡터에서 문자열을 제거합니다.

qwer.cpp:20: error: no matching function for call to 'remove_if(__gnu_cxx::__nor 
mal_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char 
> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator 
<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::al 
locator<char> > > > >, __gnu_cxx::__normal_iterator<std::basic_string<char, std: 
:char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_strin 
g<char, std::char_traits<char>, std::allocator<char> > > > >, boost::_bi::bind_t 
<boost::_bi::unspecified, std::less<unsigned int>, boost::_bi::list2<boost::_bi: 
:bind_t<unsigned int, boost::_mfi::cmf0<unsigned int, std::basic_string<char, st 
d::char_traits<char>, std::allocator<char> > >, boost::_bi::list1<boost::arg<1> 
> >, boost::_bi::value<int> > >, __gnu_cxx::__normal_iterator<std::basic_string< 
char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_st 
ring<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::b 
asic_string<char, std::char_traits<char>, std::allocator<char> > > > >)' 

다음 솔루션은 작동합니다 :

std::vector<std::string> vec; 

// ... 

vec.erase(std::remove_if(vec.begin(), 
         vec.end(), 
         boost::bind(std::less<size_t>(), 
            boost::bind(&std::string::length, _1), 
            5), 
      vec.end()); 

는 컴파일러는 매우 큰 오류 메시지가 뱉어

vec.erase(std::remove_if(vec.begin(), 
         vec.end(), 
         boost::bind(&std::string::length, _1) < 5), 
      vec.end()); 

을하지만 난 여전히 내가 처음에 뭘 잘못했는지에 관해서 궁금 번역. 감사!

답변

5

괄호를 사용하지 않는 것 같습니다 (5 번 이후 두 개가 있어야합니다. 하나는 바인드를 닫고 하나는 remove_if를 닫습니다). 이것은 잘못된 토큰이나 다른 오류 메시지에 대한 다른 오류 메시지를 표시하지 않습니다. , 괄호가 분명히 불균형으로되어 있기 때문에 (SO를 준비하면서 끝에서 여분의 괄호를 제거 했습니까?). 오류 메시지에서 remove_if에 대한 템플릿 인수를 읽는다면 마지막 하나는 boost_t이며, 그 다음에 다른 gnu :: iterator가 있기 때문입니다.

+0

감사합니다. 그것은 어리석은 실수였습니다. – fredoverflow

+0

음, 이제 컴파일됩니까? 아직도 저를 보며 .. 두 번째 "솔루션"이 왜 컴파일되는지조차 알지 못합니다. –

+3

바인드는 일부 연산자를 오버로드하여 작성 술어를 더 빠르게 만듭니다. 매우 정교한 기능입니다. http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html#operators –