这让我陷入困境。
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
。
由于我需要删除非字母字符,因此它将删除字母字符。迫使我创建单独的方法,我提到这是我的第一个问题。它一直有效,直到我把方法移到课堂上。
我有可能错过一些完全明显的东西,但我无法弄明白......
答案 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());