Доброго дня all!
Пишу небольшой шаблон, но собираться никак не хочет, не могу понять в чем проблема подскажите кому не сложно:template<typename T>
void removeSubstrs( basic_string<T>& s,
const basic_string<T>& p) {
basic_string<T>::size_type n;
n = p.length( );
// string::size_type n = p.length( );
for ( basic_string<T>::size_type i = s.find(p); i != basic_string<T>::npos; i = s.find(p)) s.erase(i, n);
};При сборке получаю ошибки:
In file included from ./2.cpp:2:
./txtlib_.h: In function ‘void removeSubstrs(std::basic_string<_CharT, std::char_traits<_CharT>, std::allocator<_CharT> >&, const std::basic_string<_CharT, std::char_traits<_CharT>, std::allocator<_CharT> >&)’:
./txtlib_.h:65: ошибка: expected `;' before ‘n’
./txtlib_.h:66: ошибка: нет декларации ‘n’ в этой области видимости
./txtlib_.h:68: ошибка: expected `;' before ‘i’
./txtlib_.h:68: ошибка: нет декларации ‘i’ в этой области видимостиPS: Без шаблона функция работает нормально.
В boost есть ф-ция erase_all() (http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/us...), как раз подходящая для вашегос случая, насколько понимаю. Рекомендую использовать boost вместо своих велосипедов.
P.S. А побеждается, это добавлением ключевого слова typename перед типом:
template<typename T>
void removeSubstrs( basic_string<T>& s,
const basic_string<T>& p) {
typename basic_string<T>::size_type n;
n = p.length( );
// string::size_type n = p.length( );
for (typename basic_string<T>::size_type i = s.find(p); i != basic_string<T>::npos; i = s.find(p)) s.erase(i, n);
};
Давно на с++ не кодил, но насколько я помню то
basic_string<T>::size_type n;
надо декларировать как typename
basic_string<T>::size_type n;
>Давно на с++ не кодил, но насколько я помню то
> basic_string<T>::size_type n;
>надо декларировать как typename
> basic_string<T>::size_type n;Благодарю всех кто ответил.
По поводу:
> Рекомендую использовать boost вместо своих велосипедов.Данный пример был взят из этой книги http://www.ozon.ru/context/detail/id/3108549/
про boost читал, но еще не пробовал.