我正在使用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
有一阵子,我正在使用记事本++和命令行编译。因此,更重要的是:RCF有两种执行远程调用的方法-同步和异步。 Syncronous现在还可以。异步是可以的...除了一种情况。
我有很多绑定到回调的函数:
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
类型说明符使它完全成为编译器的另一个重载函数,并且在这种情况下未实现虚拟方法。
关于c++ - 远程调用框架和纯虚拟方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26173337/