首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

使用泛型算法的异常

2012-03-27 
使用泛型算法的错误#include iostream#incldue stringusingnamespacestdclassCounter{public:Counter

使用泛型算法的错误
#include <iostream>
#incldue <string>
using   namespace   std;

class   Counter{
            public:
                          Counter(char   c):_c(c){}
                          bool   operator()(const   string   &str){return   str.find(_c)   !=   string::npos;}
            private:
                            char   _c;
};

int   Find(const   string   &str)
{
        return   count_if(str.begin(),str.end(),Counter( ', '));
}

int   main()
{
        string   str( "asdfkasdf,asdfiekf,afksf ");
        cout < <Find(str) < <endl;
        system( "pause ");
        return   0;
}

错误信息      
  C:\Dev-Cpp\include\c++\3.4.2\bits\stl_algo.h   In   function   `typename   std::iterator_traits <_Iterator> ::difference_type   std::count_if(_InputIterator,   _InputIterator,   _Predicate)   [with   _InputIterator   =   __gnu_cxx::__normal_iterator <const   char*,   std::basic_string <char,   std::char_traits <char> ,   std::allocator <char>   >   > ,   _Predicate   =   Counter] ':

[解决办法]
bool operator()(const string &str){return str.find(_c) != string::npos;}
参数不对
bool operator()(char )
这样才可以
[解决办法]
你定义的class Counter中
bool operator()(const string &str)
需要的参数是const string。
但是看一下你的Find函数:
int Find(const string &str)
{
return count_if(str.begin(),str.end(),Counter( ', '));
}
str.begin()返回的const_iterator所指向的是一个char,参数类型不匹配。
具体怎么改,还要看你想实现什么功能。你的原意是什么
[解决办法]
呵呵,应该是这样的。
如何写functor,还是找本《STL源码剖析》认真学学吧。
[解决办法]
class Counter{
public:
Counter(char c):_c(c){}
bool operator()(char c){return c == _c;}
private:
char _c;
};

int Find(const string &str)
{
return count_if(str.begin(),str.end(),Counter( ', '));
}
[解决办法]
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

class Counter{
public:
Counter(char c):_c(c){}
bool operator()(const char c){return c==_c;}
private:
char _c;
};

int Find(const string &str)
{
return count_if(str.begin(),str.end(),Counter( ', '));
}

int main()
{
string str( "asdfkasdf,asdfiekf,afksf ");
cout < <Find(str) < <endl;
system( "pause ");
return 0;
}

热点排行