2014-11-13 3 views
1

Это приводит меня к стене.Удаление алфавитного символа из строки C++

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()); 

Doesnt работа без использования статического актерский, и я использую cctype или ctype.h библиотеки, статические литая для C++ локали библиотеки, которые я не использую.

Я могу заставить его работать с использованием статического литья, но тогда я не могу сделать его отрицательным !isalpha. Поскольку мне нужно удалить несимвольные символы и как есть, он удалит буквенные символы. Заставляя меня создавать отдельный метод, о котором я упоминал в качестве своей первой проблемы. И это сработало, пока я не переместил метод в класс.

Скорее всего, я что-то совершенно очевидно, не хватает, но я просто не могу понять это ...

+0

хорошо читать [ссылка] (http://yosefk.com/c++fqa/function.html) – 101010

+0

@ 40two FQA не был обновлен для C++ 11, я вижу. Обновленный ответ на 33.10, который использует lambdas C++ 11, может быть уместным здесь, если было бы невозможно обновить 'aZCheck', чтобы быть статичным. – hvd

ответ

3

Объявить функцию в качестве статической функции члена

static bool aZCheck(char c); 

принять во внимание, что функция может быть определяется проще

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

} 
+0

ошибка: не может объявить функцию-член 'static bool Tree :: aZCheck (char)' для статической связи [-fpermissive] | Любые предложения? –

+0

@Aistis Taraskevicius Вы должны использовать ключевое слово static только с объявлением функции внутри класса. –

+0

Привет, сделал трюк. –

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()); 
+0

Как отдельный вопрос, функции arent вне класса, которые необходимы для функционирования класса, будут плохой практикой? И как можно вызвать внешнюю функцию класса из класса? –

+0

@AistisTaraskevicius _ "не являются функциями вне класса ... плохая практика .." _ Я не верю, что они для этого случая. На самом деле это обычная практика. –

+0

@AistisTaraskevicius Еще лучшей практикой для современного C++ является использование лямбда-выражений как _ @ 40two_. –

2

Если ваш компилятор поддерживает C++ 11 и таким образом лямбды вы могли бы просто:

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

Хорошая точка. .............. –

Смежные вопросы