Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ] - C++

18.06.2014, 22:44. Просмотров 478. Ответов 4
Метки нет (Все метки)

Здравствуйте.

Задача поиска палиндрома (выражения, в котором не имеет значение направление чтения букв). Сказано, чтобы не буквы игнорировались. Вот код:
C++
1
2
3
4
5
6
7
bool check( const string& s) {
    string temp = "", rtemp = "";
    copy_if(s.cbegin(), s.cend(), front_insert_iterator<string>(temp), isalpha);
    copy(temp.cbegin(), temp.cend(), back_insert_iterator<string>(rtemp));
    
    return temp == rtemp ? true : false ;
}
Компилятор выводит вот что:
Кликните здесь для просмотра всего текста
main.cpp:28:79: error: no matching function for call to ‘copy_if(std::basic_string<char>::const_iterator, std::basic_string<char>::const_iterator, std::front_insert_iterator<std::basic_string<char> >, <unresolved overloaded function type>)’
copy_if(s.cbegin(), s.cend(), front_insert_iterator<string>(temp), isalpha);
^
main.cpp:28:79: note: candidate is:
In file included from /usr/include/c++/4.8/algorithm:62:0,
from main.cpp:10:
/usr/include/c++/4.8/bits/stl_algo.h:974:5: note: template<class _IIter, class _OIter, class _Predicate> _OIter std::copy_if(_IIter, _IIter, _OIter, _Predicate)
copy_if(_InputIterator __first, _InputIterator __last,
^
/usr/include/c++/4.8/bits/stl_algo.h:974:5: note: template argument deduction/substitution failed:
main.cpp:28:79: note: couldn't deduce template parameter ‘_Predicate’
copy_if(s.cbegin(), s.cend(), front_insert_iterator<string>(temp), isalpha);


Режим C++11 включен. Что не так с предикатом - не пойму. Помогите разобраться, пожалуйста.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2014, 22:44     Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ]
Посмотрите здесь:

Error: no matching function for call to 'tan(float&, int)' - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { float x,A,Z,B,Betta, *a; int n,...

No matching function to call to - C++
не могу никак понять, в чём дело: class field_box{ public: field_box(vec2 ipos,vec2 isize, int a){ ...

exceptions (no matching function for call to .) - C++
Помогите, пожалуйста, разобраться с исключениями: double ctok(double c) { return c + 273.15; } int main() { try { ...

Ошибка: no matching function for call to - C++
Здравствуйте. Вот такая ошибка: /usr/include/c++/4.8/bits/stl_algo.h:2235:62: required from ‘void...

no matching function for call to `Serio'::ras4et()' - C++
Как понять такую Ошибку?

Ошибка компиляции: no matching function for call to - C++
Здравствуйте форумчане. Возникает ошибка компиляции no matching function for call to в коде: editor-&gt;make_field&lt;Game, WString,...

Ошибка компиляции: no matching function for call - C++
В классе объявлено 4 конструктора: MyClass() = default; explicit MyClass(const MyClass&amp;) = default; explicit...

Наследование классов, ошибка no matching function for call to - C++
Здравствуйте. Имеется программа с классом tre. Пытаюсь сделать наследование Новым классом Trel, но получаю ошибку no matching function for...

Как исправить ошибку: no matching function for call - C++
TArray &lt;std::wstring&gt; Result; std::ifstream File; File.open(Path.c_str()); return Result;

Ошибка no matching function for call to при работе с файлом - C++
возникает ошибка no matching function for call to 'getline(std::string&amp;, std::string&amp;)' #include &lt;iostream&gt; #include &lt;string&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.06.2014, 23:16     Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ] #2
Цитата Сообщение от andrejap Посмотреть сообщение
C++
1
string temp = "", rtemp = "";
строки и так пустые по умолчанию

Цитата Сообщение от andrejap Посмотреть сообщение
C++
1
return temp == rtemp ? true : false ;
== и так возвращает true/false

Цитата Сообщение от andrejap Посмотреть сообщение
C++
1
front_insert_iterator<string>(temp)
а где вы у string видели метод push_front ?
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
19.06.2014, 23:36  [ТС]     Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ] #3
Уф, мерси за эти 2 первые позорные поправки. Стыдно мне было не додуматься.
Цитата Сообщение от Jupiter Посмотреть сообщение
а где вы у string видели метод push_front ?
То есть там надо просто insert_iterator?

Добавлено через 14 минут
Забыл включить заголовочный файл iterator.
Включил, поправил и все-равно g++ то самое говорит.
А вот clang++ вот что выдает:
Кликните здесь для просмотра всего текста
clang++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/Clang-Linux-x86/main.o.d" -o build/Debug/Clang-Linux-x86/main.o main.cpp
main.cpp:29:5: error: no matching function for call to 'copy_if'
copy_if(s.cbegin(), s.cend(), insert_iterator<string>(temp, temp.begin()), isalpha);
^~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_algo.h:974:5: note: candidate template ignored: couldn't infer template argument '_Predicate'
copy_if(_InputIterator __first, _InputIterator __last,
^
1 error generated.

Весь код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cctype>
#include <algorithm>
#include <string>
#include <iterator>
 
using namespace std;
bool check( const string& );
 
int main( )
{
    string source;
    while ( cin >> source && source != "quit" ) {
        if ( check(source) )
            cout << "This is palindrome.\n";
    }
    return 0;
}
 
bool check( const string& s) {
    string temp, rtemp;
    copy_if(s.cbegin(), s.cend(), insert_iterator<string>(temp, temp.begin()), isalpha);
    //for_each(temp.begin(), temp.end(), tolower);
    copy(temp.cbegin(), temp.cend(), back_insert_iterator<string>(rtemp));
    
    return temp == rtemp;
}


Добавлено через 23 часа 47 минут
Оказалось проблема в том, что аргумент предиката в copy_if должен соответствовать типу разименованого итератора. То есть, std::isalpha() требует int, а в stl-функции предлагается char.

Посему вопрос в следующем: пытаюсь исправить ситуацию написав функцию toLower():
C++
1
2
3
4
char& toLower(char& ch) { return tolower(ch); }
// ...
string S = "XxxY";
    for_each(S.begin(), S.end(), toLower);
Компилятор говорит:
In function ‘char& toLower(char&)’: error: invalid initialization of non-const reference of type ‘char&’ from an rvalue of type ‘int’.

Я вообще запутался - мне же нужно аргумент этой функции и возвращаемый тип дать как ссылки, чтобы можно было изменить элемент string? А вот не-ссылочный вариант char toLower(char) принимает нормально. Как это обойти?

Добавлено через 15 минут
Такая функция помогла:

C++
1
2
3
void toLower(char& ch) { 
    ch = tolower(ch);   
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.06.2014, 11:00     Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ] #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
andrejap, вся проблема в
C++
1
using namespace std;
Потому что берется std::isalpha, который имеет несколько перегрузок, а не глобальный ::isalpha.
Поэтому, решение может быть такое:
C++
1
2
3
4
5
6
7
8
//using namespace std;
 
using std::string;
using std::cout;
using std::endl;
using std::cin;
using std::insert_iterator;
using std::back_insert_iterator;
Или такое:
C++
1
copy_if(s.cbegin(), s.cend(), insert_iterator<string>(temp, temp.begin()), ::isalpha);
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
20.06.2014, 18:47  [ТС]     Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ] #5
Спасибо!
Yandex
Объявления
20.06.2014, 18:47     Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ]
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru