Я использую RCF (http://www.deltavsoft.com/RCF.html) + protobuf (https://code.google.com/p/protobuf/) для удаленного вызова функций (встроенный сервер Linux + клиент Windows).
Моя проблема связана с клиентом Windows.
Я использую MinGW и Qt 5.3.1 для клиента, но я не могу использовать QtCreator: он постоянно терпит неудачу, если исходный код RCF добавлен в INCLUDEPATH. Похоже, это известная проблема, но еще не решенная:
https://bugreports.qt-project.org/browse/QTCREATORBUG-12890?page=com.googlecode.jira-suite-utilities:transitions-summary-tabpanel
Некоторое время я использую notepad ++ и компиляцию командной строки. Итак, ближе к делу: у RCF есть два способа выполнять удаленные вызовы — синхронный и асинхронный. Синхронный пока нормально. Асинхронный в порядке … кроме одного случая.
У меня есть много функций, которые связываются с обратным вызовом:
void p347ClientWrapper::onAsyncFunctionCompleted(RCF::Future<int> fRet, int if_code) {
//code here is no matter
}
Связывание, согласно примерам RCF:
RCF::Future<int> fRet;
fRet = client->anyOfMyFunctions(
RCF::AsyncTwoway( boost::bind(&p347ClientWrapper::onAsyncFunctionCompleted, this, fRet, if_code) ),
any_parameter_of_my_function);
«клиент» — это RcfClient
Большинство функций работает нормально. Но один из них (выглядит так же, как другие) приводит к
pure virtual method called
terminate called without an active exception
И это происходит (как я полагаю) где-то рядом с обратным вызовом, потому что этот вызов обрабатывается нормально на стороне сервера. Я думаю, этот «чистый виртуал» прячется где-то в классах RCF. К сожалению, я не могу найти способ, как расследовать дело …
ОБНОВИТЬ:
Внезапно я нашел лекарство, но все еще не до конца понимаю причину.
Давайте посмотрим определение RCF:
RCF_METHOD_R1(int,doStartRotChannel_fixed,const channel_manager::RotChannelInitParams &)
Работает нормально
RCF_METHOD_R1(int,doStartRotChannel_orig,channel_manager::RotChannelInitParams &)
Причины «чисто виртуальный метод называется»
Итак, если я объявлю параметр как Const , оно работает. Я не знаю почему, может быть, кто-то может объяснить.
Из C ++ 03 Раздел: 13.1-3
спецификаторы типа const и volatile, скрытые в типе параметра
спецификации важны и могут использоваться для различения
перегруженные объявления функций.
const
спецификатор типа в вашем определении делает его полностью другой перегруженной функцией для компилятора, и предполагаемый виртуальный метод в этом случае не реализован.