LINUX.ORG.RU

Баг или фича?


0

1

Привет всем. Есть код

AsyncRunner *runner = new AsyncRunner(this);
void* runFunc = &this->loadListFromDB();
runner->setRunFunction((FinishedTransfers*)runFunc);
На вторую из этих строчек g++ ругается ошибкой «lvalue required '&' as unary operand». Это нормальное поведение компилятора или я допустил все же ошибку? Версия компилятора:
g++ --version
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Всем спасибо.

[code] AsyncRunner *runner = new AsyncRunner(this); void (*runFunc)() = this->loadListFromDB; [/code] НО! loadListFromDB должна быть статичной.

Rorschach
()
Ответ на: комментарий от LongLiveUbuntu

Не может такого быть. Проверь еще раз. Знака & и скобок не должно быть, функция loadListFromDB должна быть объявлена как static. И покажи поправленный код.

Rorschach
()
Ответ на: комментарий от Rorschach

А все, каюсь, забыл амперсанд убрать.

Еще такой вопрос: я правильно понял, что std::function<> в С++11 и boost::function<> до него - равнозначны?

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от Rorschach
AsyncRunner *runner = new AsyncRunner(this);
        void (*runFunc)() = this->loadListFromDB;
        runner->setRunFunction((FinishedTransfers*)runFunc);

Теперь порядок. Правда нашлись тут же другие ошибки, но это бэкпортирование такое бэкпортирование )

LongLiveUbuntu ★★★★★
() автор топика

Оно кучу ошибок в бусте нашло.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu
((FinishedTransfers*)runFunc)

Нельзя так кастовать по-моему. Имей также ввиду, что в runFunc и loadListFromDB не передается указатель this(так как статик)

Rorschach
()
Ответ на: комментарий от Rorschach

Указатели в С++ всегда были моим слабым местом )

Компилятор теперь еще и на <boost/function> ругается по-черному.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от Reset

Если кратко, то тебе надо сделать что-то типа такого.

runner->setRunFunction(std::bind1st(
      std::mem_fun(&ClassName::loadListFromDB), this);

Reset ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

тогда так

runner->setRunFunction(loadListFromDB);

Reset ★★★★★
()
Ответ на: комментарий от Reset

Фишка в том, что мне доступен только g++ 4.4 и обновлять его я не имею права, поэтому std::function везде заменена на boost::function и код чистится от лямбда-выражений.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

std::bind1st и std::mem_fun входят в стандарт c++2003, поэтому всё должно работать

Reset ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu
/home/den/src/eiskaltdcpp_project/eiskaltdcpp/eiskaltdcpp-qt/src/main.cpp:180:   instantiated from here
/usr/include/boost/function/function_template.hpp:112: error: ‘f’ cannot be used as a function

1. покажи main
2. а нафига вообще эта колбасня с указателями на функции? может тебе хватит сигналов и слотов?

shty ★★★★★
()
Ответ на: комментарий от shty

Не знать, я просто пытаюсь заставить этот код компилироваться и правильно работать под старой версией gcc.

LongLiveUbuntu ★★★★★
() автор топика

Глянул сорцы eiskaltdcpp-2.2.4. От увиденного ужаса у меня волосы зашевелились побоюсь сказать где. Авторов этого говна надо подвесить за яйца, а потом расстрелять уже только за одно использование boost::wtf::detail.

Reset ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

loadListFromDB использует this, поэтому не может быть static. Используй

runner->setRunFunction(std::bind1st(
      std::mem_fun(&FinishedTransfers::loadListFromDB), this);

Reset ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

В версии 2.2.4 на этом месте лямбды нет, а используется bind.

Reset ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

И на кой они это сделали?

Вот так убирается лямбда

runner->setRunFunction(boost::bind(&FinishedTransfers::loadListFromDB, this));

Reset ★★★★★
()
Ответ на: комментарий от shty

Пока что да.

//Хотелось бы поддерживать более регулярный контакт, если не возражаете. Сейчас отправлю jabber-запрос.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

ок ) я только сейчас в рабочей запарке, но если чего - милости велкам

shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.