Задать вопрос

Ошибка компиляции C++?

Покурил мануалы и Google — не помогло, не могу понять в чем проблема.


В общем, понадобилось использовать std::sort() внутри класса для сортировки vector


Пишу:

template<class T> class ClassName {	
	private:
		std::vector<T> myvector;
	public:
		void data_sort(SortMode mode);
                            ...
		bool compare_asc(const T i, const T j);   //Для сортировки по возрастанию
		bool compare_desc(const T i, const T j); //По убыванию
                            ...
};
...
template<class T>
void ClassName<T>::data_sort(SortMode mode)
{
	switch(mode) {
		case ASC:
			std::sort(myvector.begin(), myvector.end(), ClassName<T>::compare_asc);
			break;
		case DESC:
			std::sort(myvector.begin(), myvector.end(), ClassName<T>::compare_desc);
			break;
	}
}

template<class T>
bool ClassName<T>::compare_asc(const T i, const T j)
{
	return (i < j);
}

template<class T>
bool ClassName<T>::compare_desc(const T i, const T j)
{
	return (i > j);
}
...



В итоге получаю следующее
In member function ‘void ClassName::data_sort(SortMode) [with T = int]’:<br/>
main.cpp:73:30: instantiated from here<br/>
storage.h:44:4: error: no matching function for call to ‘sort(std::vector&lt;int, std::allocator &gt;::iterator, std::vector&lt;int, std::allocator &gt;::iterator, )’<br/>
storage.h:44:4: note: candidates are:<br/>
/usr/include/c++/4.6/bits/stl_algo.h:5317:5: note: template&lt;class _RAIter&gt; void std::sort(_RAIter, _RAIter)<br/>
/usr/include/c++/4.6/bits/stl_algo.h:5353:5: note: void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator&lt;int*, std::vector&lt;int, std::allocator &gt; &gt;, _Compare = bool (ClassName::*)(int, int)]<br/>
/usr/include/c++/4.6/bits/stl_algo.h:5353:5: note: no known conversion for argument 3 from ‘’ to ‘bool (ClassName::*)(int, int)’<br/>
<br/>
То есть насколько я понял, компилятор не может понять какую функцию вызывать, поданную ей в качестве параметра, либо стандартную.<br/>
Вроде бы, сделал всё как описано в <a href="http://cplusplus.com/reference/algorithm/sort/">примере</a>
  • Вопрос задан
  • 5835 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Malenkov
@Malenkov
static bool compare_asc(const T i, const T j);   //Для сортировки по возрастанию
static bool compare_desc(const T i, const T j); //По убыванию

А так?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@BaJlepa
compare_asc и compare_desc должны быть статическими, при таком использовании
Ответ написан
Комментировать
AxisPod
@AxisPod
www.cplusplus.com/reference/algorithm/sort/
Можно использовать как статическую функцию, так и функтор, если хочется использовать метод объекта, то тут уже сложнее, но возможно, к примеру использовать boost::bind.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы