попытка скомпилировать следующий код, я получаю эту ошибку компиляции, что я могу сделать?
C++ ISO запрещает взятие адреса неполного или заключил нестатическую функцию членства в скобки для формирования указателя на функцию членства.
class MyClass {
int * arr;
// other member variables
MyClass() { arr = new int[someSize]; }
doCompare( const int & i1, const int & i2 ) { // use some member variables }
doSort() { std::sort(arr,arr+someSize, &doCompare); }
};
Как говорит Андреас Бринк, doCompare должен быть статическим (+1). Если вам НЕОБХОДИМО иметь состояние в вашей функции компаратора (используя другие члены класса), тогда вам лучше использовать функтор вместо функции (и это будет быстрее):
class MyClass{
// ...
struct doCompare
{
doCompare( const MyClass& info ) : m_info(info) { } // only if you really need the object state
const MyClass& m_info;
bool operator()( const int & i1, const int & i2 )
{
// comparison code using m_info
}
};
doSort()
{ std::sort( arr, arr+someSize, doCompare(*this) ); }
};
Использование функтора всегда лучше, просто дольше печатать (это может быть неудобно, ну да ладно ...)
Я думаю, вы также можете использовать std :: bind с функцией-членом, но я не уверен, как это сделать, и это все равно будет нелегко прочитать .
ОБНОВЛЕНИЕ 2014: Сегодня у нас есть доступ к компиляторам C ++ 11, так что вместо этого вы можете использовать лямбда, код будет короче, но будет иметь ту же семантику.
Есть способ делать то, что вы хотите, но вам нужно использовать небольшой адаптер. Поскольку STL не пишет это за вас, можете написать это сами:
template <class Base, class T>
struct adaptor_t
{
typedef bool (Base::*method_t)(const T& t1, const T& t2));
adaptor_t(Base* b, method_t m)
: base(b), method(m)
{}
adaptor_t(const adaptor_t& copy) : base(copy.base), method(copy.method) {}
bool operator()(const T& t1, const T& t2) const {
return (base->*method)(t1, t2);
}
Base *base;
method_t method;
}
template <class Base, class T>
adaptor_t<Base,T> adapt_method(Base* b, typename adaptor_t<Base,T>::method_t m)
{ return adaptor_t<Base,T>(b,m); }
Затем вы можете использовать его:
doSort() { std::sort(arr,arr+someSize, adapt_method(this, &doCompare)); }
doCompare( const int & i1, const int & i2 ) { // use some member variables }
на
bool operator () ( const int & i1, const int & i2 ) { // use some member variables }
и вызвав:
doSort() { std::sort(arr,arr+someSize, *this); }
Также, Разве
doSort
не пропускает возвращаемое значение?Я думаю, можно использовать
std :: mem_fun
и какую-то привязку, чтобы превратить функцию-член в бесплатную функцию , но точный синтаксис в данный момент ускользает от меня.EDIT: Doh,
std :: sort
принимает функтор по значению, что может быть проблемой. Чтобы обойти эту проблему, оберните функтор внутри класса:class MyClass { struct Less { Less(const MyClass& c) : myClass(c) {} bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} MyClass& myClass; }; doSort() { std::sort(arr,arr+someSize, Less(*this)); } }