count_if bind2nd greater<string> = error???

Discussion in 'C++' started by cpp, Feb 21, 2011.

  1. cpp

    cpp Guest

    In the code below I'm trying to cound the number of times a string
    reater than B occours with count_if and bind2nd.

    The example on ints in vector vi works fine.

    But the code for the string case does not compile. I'm *sure* this
    should work, but I just cannot see what is wrong.

    Could someone point me in the right direction pls - I'm tearing my
    hair out.

    Compiler is Visual Studio 2005 SP2

    -----------------------------------------
    #include <iostream>
    #include <vector>
    #include <functional>
    #include <algorithm>
    using namespace std;


    int main()
    {
    std::vector<std::string> s;
    vector<int> vi;
    // fill vectors

    std::cout << std::count_if(
    vi.begin(),
    vi.end(),
    std::bind2nd(std::greater<int>(),1));

    std::cout << std::count_if(
    s.begin(),
    s.end(),
    std::bind2nd(std::greater<string>(),"B")); //
    compile error here ???

    return 0;
    }

    end the error is :

    1>------ Build started: Project: TopCoder_Arena, Configuration: Debug
    Win32 ------
    1>Compiling...
    1>TopCoder.cpp
    1>g:\program files\microsoft visual studio 8\vc\include
    \functional(132) : error C2784: 'bool std::eek:perator >(const
    std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could
    not deduce template argument for 'const std::vector<_Ty,_Alloc> &'
    from 'const std::string'
    1> g:\program files\microsoft visual studio 8\vc\include
    \vector(1285) : see declaration of 'std::eek:perator >'
    1> g:\program files\microsoft visual studio 8\vc\include
    \functional(131) : while compiling class template member function
    'bool std::greater<_Ty>::eek:perator ()(const _Ty &,const _Ty &) const'
    1> with
    1> [
    1> _Ty=std::string
    1> ]
    1> g:\code\c++\visual studio projects\topcoder_arena
    \topcoder.cpp(20) : see reference to class template instantiation
    'std::greater<_Ty>' being compiled
    1> with
    1> [
    1> _Ty=std::string
    1>
     
    cpp, Feb 21, 2011
    #1
    1. Advertising

  2. On 2/21/2011 11:32 AM, cpp wrote:
    > In the code below I'm trying to cound the number of times a string
    > reater than B occours with count_if and bind2nd.
    >
    > The example on ints in vector vi works fine.
    >
    > But the code for the string case does not compile. I'm *sure* this
    > should work, but I just cannot see what is wrong.
    >
    > Could someone point me in the right direction pls - I'm tearing my
    > hair out.
    >
    > Compiler is Visual Studio 2005 SP2
    >
    > -----------------------------------------
    > #include<iostream>
    > #include<vector>
    > #include<functional>
    > #include<algorithm>
    > using namespace std;
    >
    >
    > int main()
    > {
    > std::vector<std::string> s;
    > vector<int> vi;
    > // fill vectors
    >
    > std::cout<< std::count_if(
    > vi.begin(),
    > vi.end(),
    > std::bind2nd(std::greater<int>(),1));
    >
    > std::cout<< std::count_if(
    > s.begin(),
    > s.end(),
    > std::bind2nd(std::greater<string>(),"B")); //
    > compile error here ???


    "B" is not a string. Perhaps you could construct a temporary to pass it
    to 'bind2nd':

    ... bind2nd(greater<string>(), string("B"));

    Just a shot in the dark, really.

    >
    > return 0;
    > }
    >
    > end the error is :
    >
    > 1>------ Build started: Project: TopCoder_Arena, Configuration: Debug
    > Win32 ------
    > 1>Compiling...
    > 1>TopCoder.cpp
    > 1>g:\program files\microsoft visual studio 8\vc\include
    > \functional(132) : error C2784: 'bool std::eek:perator>(const
    > std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could
    > not deduce template argument for 'const std::vector<_Ty,_Alloc> &'
    > from 'const std::string'
    > 1> g:\program files\microsoft visual studio 8\vc\include
    > \vector(1285) : see declaration of 'std::eek:perator>'
    > 1> g:\program files\microsoft visual studio 8\vc\include
    > \functional(131) : while compiling class template member function
    > 'bool std::greater<_Ty>::eek:perator ()(const _Ty&,const _Ty&) const'
    > 1> with
    > 1> [
    > 1> _Ty=std::string
    > 1> ]
    > 1> g:\code\c++\visual studio projects\topcoder_arena
    > \topcoder.cpp(20) : see reference to class template instantiation
    > 'std::greater<_Ty>' being compiled
    > 1> with
    > 1> [
    > 1> _Ty=std::string
    > 1>


    V
    --
    I do not respond to top-posted replies, please don't ask
     
    Victor Bazarov, Feb 21, 2011
    #2
    1. Advertising

  3. cpp

    cpp Guest

    > "B" is not a string. Perhaps you could construct a temporary to pass it


    Thanks,
    yes I tought that it would be converted implicity. But even when I try
    and explicit conversion as you suggest it still fails.
    :-/.


    Different error though:

    1>g:\program files\microsoft visual studio 8\vc\include
    \functional(132) : error C2784: 'bool std::eek:perator >(const
    std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could
    not deduce template argument for 'const std::vector<_Ty,_Alloc> &'
    from 'const std::string'
    1> g:\program files\microsoft visual studio 8\vc\include
    \vector(1285) : see declaration of 'std::eek:perator >'
    1> g:\program files\microsoft visual studio 8\vc\include
    \functional(131) : while compiling class template member function
    'bool std::greater<_Ty>::eek:perator ()(const _Ty &,const _Ty &) const'
    1> with
    1> [
    1> _Ty=std::string
    1> ]
    1> g:\duffyj\c++\visual studio projects\topcoder_arena
    \topcoder.cpp(23) : see reference to class template instantiation
    'std::greater<_Ty>' being compiled
    1> with
    1> [
    1> _Ty=std::string
    > "B" is not a string.  Perhaps you could construct a temporary to pass it
    > to 'bind2nd':
    >
    >     ... bind2nd(greater<string>(), string("B"));
    >


    1>g:\program files\microsoft visual studio 8\vc\include
    \functional(132) : error C2784: 'bool std::eek:perator >(const
    std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could
    not deduce template argument for 'const std::vector<_Ty,_Alloc> &'
    from 'const std::string'
    1> g:\program files\microsoft visual studio 8\vc\include
    \vector(1285) : see declaration of 'std::eek:perator >'
    1> g:\program files\microsoft visual studio 8\vc\include
    \functional(131) : while compiling class template member function
    'bool std::greater<_Ty>::eek:perator ()(const _Ty &,const _Ty &) const'
    1> with
    1> [
    1> _Ty=std::string
    1> ]
    1> g:\duffyj\c++\visual studio projects\topcoder_arena
    \topcoder.cpp(23) : see reference to class template instantiation
    'std::greater<_Ty>' being compiled
    1> with
    1> [
    1> _Ty=std::string
     
    cpp, Feb 21, 2011
    #3
  4. cpp

    cpp Guest

    > Problem is probably due to you not doing:
    >
    > #include <string>
    >
    > /Leigh- Hide quoted text -
    >



    OMG!!! I hang my head in shame. I spent all day on that :-(.

    Interesting it complies on Comeau without the sting header being
    included.

    Thanks!!!

    SL99
     
    cpp, Feb 21, 2011
    #4
  5. On 21 Feb., cpp wrote:
    > Interesting it complies on Comeau without the sting header being
    > included.


    Note that you must not rely on implicit includes in standard headers,
    as this will become the source of hard to track bugs. Even worse,
    there are cases where perfectly legal C++ code will (legally) not
    compile with one compiler and (also legally) not compile with another
    due to the fact that one has a declaration in namespace std that is
    missing in the other.

    Regards,
    Stuart
     
    Stuart Redmann, Feb 22, 2011
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. JohanS
    Replies:
    1
    Views:
    400
    Daniel T.
    Aug 15, 2004
  2. , India
    Replies:
    7
    Views:
    332
    kwikius
    Apr 28, 2008
  3. rep_movsd
    Replies:
    15
    Views:
    972
    Francesco
    Aug 17, 2009
  4. xmllmx
    Replies:
    2
    Views:
    390
    Saeed Amrollahi
    Jun 22, 2010
  5. xmllmx
    Replies:
    6
    Views:
    358
    gwowen
    Jun 23, 2010
Loading...

Share This Page