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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа с динамического массивом - ошибка при попытке ввода http://www.cyberforum.ru/cpp-beginners/thread1211835.html
При простой попытке ввода выскакивает ошибка, что кириллица, что английский - ответ один и тот же. Что я упустил? #include <vcl.h> #include <iostream.h> #include <string.h> #pragma hdrstop #pragma argsused using namespace std; class ECM { char* type;
C++ Надо написать с использованием func функции Надо написать с помощью функции срочно пожалуйста полностью программу завтра сдавать y=((pow(x,3)+2*a*x)/(sqrt(x+3))+3+x*3)/pow(x-1,2); http://www.cyberforum.ru/cpp-beginners/thread1211828.html
Поверхность некоторого тела покрыто n = 4 треугольными пластинами C++
Поверхность некоторого тела покрыто n = 4 треугольными пластинами. Координаты первой пластины, уi1, zi1, xi2, yi2, zi2, xi3, yi3, zi3, i = 1, ..., N. Пластины не накладываются друг на друга. С точки (х0, у0, z0) вертикально вверх выходит луч. Определить через внутренние точки скольких пластин проходит этот луч.
C++ Ссылка на неразрешенный внешний символ, LNK2019
Имеется две функции: // объявления template <class Type> class QueueTp { .... bool push(const Type& t); bool pop(); .... }
C++ Откуда берутся лишние элементы? http://www.cyberforum.ru/cpp-beginners/thread1211767.html
String String::operator + (String right){ int len = strlen(this->myString) + strlen(right.myString); cout << len<< endl;// 14 char *temp1 = new char; cout << "temp " << strlen(temp1) << " temp *" << endl;//32 }
C++ Написать программу, которая вычерчивает на экране кораблик c++ Написать программу, которая вычерчивает на экране кораблик c++ подробнее

Показать сообщение отдельно
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
19.06.2014, 23:36  [ТС]     Поиск палиндрома. Итераторы. [ error: no matching function for call to ‘copy_if . ' ]
Уф, мерси за эти 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);   
}
 
Текущее время: 01:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru