2014-10-03 1 views
0

Я использую RCF (http://www.deltavsoft.com/RCF.html) + protobuf (https://code.google.com/p/protobuf/) для удаленного вызова функций (встроенный сервер linux + клиент Windows). Моя проблема связана с клиентом Windows.Remote Call Framework и чистый виртуальный метод где-то

Я использую 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 имеет два способа выполнения удаленных вызовов - синхронный и асинхронный. На данный момент синхронно. Asyncronous в порядке ... кроме одного случая.

У меня есть много функций, которые связываются с обратным вызовом:

void p347ClientWrapper::onAsyncFunctionCompleted(RCF::Future<int> fRet, int if_code) { 
    //code here is no matter 
} 

Binding, согласно примерам 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. К сожалению, я не могу найти способ, как расследование дела ...

UPDATE:

Внезапно я нашел лекарство, но до сих пор не в полной мере понять причину.

Давайте посмотрим определение RCF:

RCF_METHOD_R1(int,doStartRotChannel_fixed,const channel_manager::RotChannelInitParams &) 

Он отлично работает

RCF_METHOD_R1(int,doStartRotChannel_orig,channel_manager::RotChannelInitParams &) 

причины "чисто виртуальный метод, называемый"

Так что, если я объявляю параметр как сопзЬ, она работает , Я не знаю, почему, может быть, кто-то может объяснить.

ответ

1

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^