从字符串c ++中删除非字母字符

时间:2014-11-13 21:33:45

标签: c++ string idioms

这让我陷入困境。

template<typename t>
void Tree<t>::readFromFile(string filename)
{
//
    str.erase( remove_if(str.begin(), str.end(), aZCheck), str.end());
//
}
template<typename t>
bool Tree<t>::aZCheck(char c)
{
    if (isalpha(c))
        return false;
    else return true;

}

给出错误:cannot convert 'Tree<t>::aZCheck<std::basic_string<char> >' from type 'bool (Tree<std::basic_string<char> >::)(char)' to type 'bool (Tree<std::basic_string<char> >::*)(char)'|

工作正常,直到我将两种方法都移到课堂上。

str.erase( remove_if(str.begin(), str.end(), isalpha), str.end());

不使用静态强制转换并且我使用cctype或ctype.h库时,静态强制转换用于我不使用的c ++语言环境库。

我可以使用静态强制转换来使用它,但是我似乎无法将其设为负值!isalpha。 由于我需要删除非字母字符,因此它将删除字母字符。迫使我创建单独的方法,我提到这是我的第一个问题。它一直有效,直到我把方法移到课堂上。

我有可能错过一些完全明显的东西,但我无法弄明白......

3 个答案:

答案 0 :(得分:3)

将该函数声明为静态成员函数

static bool aZCheck(char c);

考虑到可以更简单地定义函数

template<typename t>
inline bool Tree<t>::aZCheck( char c )
{
    return isalpha( (unsigned char )c );

}

答案 1 :(得分:2)

如果您的编译器支持C ++ 11,那么lambdas就可以:

  str.erase(std::remove_if(str.begin(), str.end(), [](char c) { return !isalpha(c); }), str.end());

答案 2 :(得分:1)

您应该为static提供免费功能(课堂声明之外)或aZCheck()成员函数。

 template<typename t>
 class Tree {
 public:
     static bool aZCheck(char c);
 };

并使用

 str.erase( remove_if(str.begin(), str.end(), Tree<t>::aZCheck), str.end());

或者更好的是拥有免费功能

 bool aZCheck(char c)  {
     return !isalpha(c));
 }

并使用

 str.erase( remove_if(str.begin(), str.end(), aZCheck), str.end());