Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2012, 23:53   #1
Boltok
 
Регистрация: 28.11.2012
Сообщений: 3
Вопрос Ошибка при переносе sort() и equal_range() в функцию класса

Пишу программу. Первоначально структуры, переменные и функции - вне класса. Компилируется удачно.
В одной из функций использую из algorithms.h шаблонную sort() вида

Код:
template <class RandomAccessIterator, class Compare>
  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
И функцию equal_range() для pair оттуда же вида:
Код:
template <class ForwardIterator, class T, class Compare>
  pair<ForwardIterator,ForwardIterator>
    equal_range ( ForwardIterator first, ForwardIterator last, const T& value,
                  Compare comp );

Поэтому вопрос на основе стандарного примера с си++ ком'a.
Как из этого:
Код:
// equal_range example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool mygreater (int i,int j) { return (i>j); }

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};
  vector<int> v(myints,myints+8);                         // 10 20 30 30 20 10 10 20
  pair<vector<int>::iterator,vector<int>::iterator> bounds;

  // using "mygreater" as comp:
  sort (v.begin(), v.end(), mygreater);                   // 30 30 20 20 20 10 10 10
  bounds=equal_range (v.begin(), v.end(), 20, mygreater); //       ^        ^

  cout << "bounds at positions " << int(bounds.first - v.begin());
  cout << " and " << int(bounds.second - v.begin()) << endl;

  return 0;
}
Сделать это, чтобы компилятор не ругался:

Код:
// equal_range example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

class Gen{
      public:
  int myints[8];
  vector<int> v;                         // 10 20 30 30 20 10 10 20
bool mygreater (int i,int j) { return (i>j); }
Gen(){  
        myints[0] = 10;
        myints[6] = 10;
        myints[5]=10; 
        myints[1]=20;
        myints[4]=20;
        myints[7]=20; 
        myints[1]=30;
        myints[3]=30; 
        v(myints,myints+8);}
};
int main () {
  Gen *obj;
  pair<vector<int>::iterator,vector<int>::iterator> bounds;

  // using "mygreater" as comp:
  sort (obj->v.begin(), obj->v.end(), obj->mygreater);                   // 30 30 20 20 20 10 10 10
  bounds=equal_range (obj->v.begin(), obj->v.end(), 20, obj->mygreater); //       ^        ^

  cout << "bounds at positions " << int(bounds.first - obj->v.begin());
  cout << " and " << int(bounds.second - obj->v.begin()) << endl;
getchar();
  return 0;
}
Ибо при таких попытках выдает для sort():

Цитата:
71 C:\Documents and Settings\Владелец\Рабочий стол\7 семестр\Курсовой_Федорук\Crossword_ 01_Мой_курсач\Crossword_01_v2_Class es.cpp no matching function for call to `sort(__gnu_cxx::__normal_iterator< GenClass::VocElement*, std::vector<GenClass::VocElement, std::allocator<GenClass::VocElement > > >, __gnu_cxx::__normal_iterator<GenCla ss::VocElement*, std::vector<GenClass::VocElement, std::allocator<GenClass::VocElement > > >, <unknown type>)'
Цитата:
note C:\include\c++\3.4.2\bits\stl_algo. h:2578 candidates are: void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<GenCla ss::VocElement*, std::vector<GenClass::VocElement, std::allocator<GenClass::VocElement > > >, _Compare = bool (GenClass::*)(const GenClass::VocElement&, const GenClass::VocElement&)]
И для equal_range():

Цитата:
no matching function for call to `equal_range(__gnu_cxx::__normal_it erator<GenClass::VocElement*, std::vector<GenClass::VocElement, std::allocator<GenClass::VocElement > > >, __gnu_cxx::__normal_iterator<GenCla ss::VocElement*, std::vector<GenClass::VocElement, std::allocator<GenClass::VocElement > > >, std::string, <unknown type>)'
Цитата:
note C:\include\c++\3.4.2\bits\stl_algo. h:3853 candidates are: std::pair<_ForwardIterator, _ForwardIterator> std::equal_range(_ForwardIterator, _ForwardIterator, const _Tp&, _Compare) [with _ForwardIterator = __gnu_cxx::__normal_iterator<GenCla ss::VocElement*, std::vector<GenClass::VocElement, std::allocator<GenClass::VocElement > > >, _Tp = std::string, _Compare = bool (GenClass::*)(const GenClass::VocElement&, const GenClass::VocElement&)]
Соответственно, мысли были и остались такие:
- не публичность переменных и не публичность bool-функции (после того, как все стало public проблема не пропала!);
- как-нибудь сделать шаблонный класс friend или наследником. Ну, тут не особо хочется переписывать заголовочный файл. И составлять по новой библиотечную функцию тоже не вариант.

P.S. Кстати, нужно, чтобы при этом vector v непременно был членом класса Gen

Последний раз редактировалось Boltok; 29.11.2012 в 00:25.
Boltok вне форума Ответить с цитированием
Старый 29.11.2012, 00:10   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Нестатическая, невиртуальная функция-член класса - это "почти" обычная функция... но она принимает ещё один, неявный аргумент - указатель на вызвавший объект, к которому в теле функции можно обращаться по ключевому слову this. А конструкция obj->mygreater, по большому счёту, бессмысленна (указатель на функцию-член пишется не так, и sort его не примет в любом случае), вот компилятор и говорит, что sort в качестве третьего аргумента попробовали скормить нечто <unknown type>.
Вариант решения: сделать Gen::mygreater статической.
Abstraction вне форума Ответить с цитированием
Старый 29.11.2012, 00:31   #3
Boltok
 
Регистрация: 28.11.2012
Сообщений: 3
Хорошо

Цитата:
Сообщение от Abstraction Посмотреть сообщение
<...>
Вариант решения: сделать Gen::mygreater статической.
Магически! А сколько было головной боли) Благодарю!
Boltok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка "cannot resolve unit name" при переносе проекта с Delphi7 на DelphiXE Ferkel Общие вопросы Delphi 1 16.06.2012 13:01
Ошибка запуска надстройки при переносе на др. комп. kuroles Microsoft Office Excel 2 17.05.2011 11:31
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
Ошибка при переносе бд krigsmahtana БД в Delphi 3 10.08.2010 11:37
Ошибка при переносе из 2006 в delphi 2009/2010 Яр|/||< (^_^) Общие вопросы Delphi 2 18.02.2010 12:01