Remote Call Framework и чистый виртуальный метод где-то

Я использую 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 , оно работает. Я не знаю почему, может быть, кто-то может объяснить.

0

Решение

Из C ++ 03 Раздел: 13.1-3

спецификаторы типа const и volatile, скрытые в типе параметра
спецификации важны и могут использоваться для различения
перегруженные объявления функций.

const спецификатор типа в вашем определении делает его полностью другой перегруженной функцией для компилятора, и предполагаемый виртуальный метод в этом случае не реализован.

1

Другие решения


По вопросам рекламы [email protected]