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

std::bind1st: is not a class, struct, or union type - C++

Восстановить пароль Регистрация
 
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
14.06.2013, 13:53     std::bind1st: is not a class, struct, or union type #1
Добрый день, пытаюсь найти элемент в списки указателей на объекты классачерез предикат. Вот упрощенный пример:
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
28
29
30
31
32
33
#include <algorithm>
#include <functional>
#include <list>
class classA{
     public:
         classA(int A): var(A) {};
         int getVar() {return var;};
     private:
         int var;
};
 
// предикат
bool pointee_is_equal(int s, classA* p) {
    return s == p->getVar();
}
 
int main()
{
 
 
std::list<classA*> listA;
for (int i = 0; i < 10; i++)
    listA.push_back(new classA(i));
 
 
int int_to_be_found = 6;
 
// нужен итератор, который начинается с элемента листа со значенем var=6
std::list<int>::iterator matching_iter =
              std::find_if(listA.begin(), listA.end(),
                          std::bind1st(pointee_is_equal, int_to_be_found));
return 0;
}
На что мне компилятор говорит

Bash
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
In file included from /usr/include/c++/4.6/bits/stl_function.h:731:0,
                 from /usr/include/c++/4.6/functional:50,
                 from test.cpp:2:
/usr/include/c++/4.6/backward/binders.h: In instantiation of ‘std::binder1st<bool(int, classA*)>’:
test.cpp:30:73:   instantiated from here
/usr/include/c++/4.6/backward/binders.h:100:11: error: ‘bool(int, classA*)’ is not a class, struct, or union type
/usr/include/c++/4.6/backward/binders.h:106:48: error: ‘bool(int, classA*)’ is not a class, struct, or union type
/usr/include/c++/4.6/backward/binders.h:109:7: error: ‘bool(int, classA*)’ is not a class, struct, or union type
/usr/include/c++/4.6/backward/binders.h:114:7: error: ‘bool(int, classA*)’ is not a class, struct, or union type
/usr/include/c++/4.6/backward/binders.h:120:7: error: ‘bool(int, classA*)’ is not a class, struct, or union type
/usr/include/c++/4.6/backward/binders.h:105:18: error: field ‘std::binder1st<bool(int, classA*)>::op’ invalidly declared function type
test.cpp: In function ‘int main()’:
test.cpp:30:74: error: conversion from ‘std::_List_iterator<classA*>’ to non-scalar type ‘std::list<int>::iterator {aka std::_List_iterator<int>}’ requested
In file included from /usr/include/c++/4.6/bits/stl_function.h:731:0,
                 from /usr/include/c++/4.6/functional:50,
                 from test.cpp:2:
/usr/include/c++/4.6/backward/binders.h: In function ‘std::binder1st<_Operation> std::bind1st(const _Operation&, const _Tp&) [with _Operation = bool(int, classA*), _Tp = int]’:
test.cpp:30:73:   instantiated from here
/usr/include/c++/4.6/backward/binders.h:129:56: error: ‘bool(int, classA*)’ is not a class, struct, or union type
In file included from /usr/include/c++/4.6/algorithm:63:0,
                 from test.cpp:1:
/usr/include/c++/4.6/bits/stl_algo.h: In function ‘_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag) [with _InputIterator = std::_List_iterator<classA*>, _Predicate = std::binder1st<bool(int, classA*)>]’:
/usr/include/c++/4.6/bits/stl_algo.h:4427:41:   instantiated from ‘_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = std::_List_iterator<classA*>, _Predicate = std::binder1st<bool(int, classA*)>]’
test.cpp:30:74:   instantiated from here
/usr/include/c++/4.6/bits/stl_algo.h:146:7: error: no match for call to ‘(std::binder1st<bool(int, classA*)>) (classA*&)

Где и что я забыл?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2013, 13:53     std::bind1st: is not a class, struct, or union type
Посмотрите здесь:

ошибка type qualifier 'std' must be a struct or class name C++
error C2228: left of '.add' must have class/struct/union type. в чем ошибка? C++
Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') C++
Union, struct C++
C++ Union внутри struct
C++ Error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::
При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union C++
Ошибка компиляции "must have class/struct/union" C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
14.06.2013, 14:07     std::bind1st: is not a class, struct, or union type #2
Итератор не того типа и функция не того. А вообще используйте лямбду

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
28
#include <algorithm>
#include <functional>
#include <list>
 
class classA{
     public:
         classA(int A): var(A) {};
         int getVar() {return var;};
     private:
         int var;
};
 
bool pointee_is_equal(int s, classA* p) {
    return s == p->getVar();
}
 
int main()
  {
 
  std::list<classA*> listA;
  for (int i = 0; i < 10; i++)
      listA.push_back(new classA(i));
 
  int int_to_be_found = 6;
  std::list<classA*>::iterator matching_iter = std::find_if(listA.begin(), listA.end(),
                            std::bind1st(std::ptr_fun(pointee_is_equal), int_to_be_found));
  return 0;
  }
Yandex
Объявления
14.06.2013, 14:07     std::bind1st: is not a class, struct, or union type
Ответ Создать тему
Опции темы

Текущее время: 14:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru