我正在关注apache thrift的教程:
https://svn.apache.org/repos/asf/thrift/attic/branches/0.9.x/tutorial/tutorial.thrift
它使用以下shared.thrift:
https://svn.apache.org/repos/asf/thrift/attic/branches/0.9.x/tutorial/shared.thrift
我通过以下方式生成所需的cpp源文件:
thrift --gen cpp shared.thrift
thrift --gen cpp tutorial.thrift
它给了我一个cpp文件列表,其中一个我看到以下内容:
class CalculatorHandler : virtual public CalculatorIf {
... }
,其中
class CalculatorIf : virtual public ::shared::SharedServiceIf {
... }
和
class SharedServiceIf {
public:
virtual ~SharedServiceIf() {}
virtual void getStruct(SharedStruct& _return, const int32_t key) = 0;
};
这不是编译,因为virtual void getStruct
在类中是纯虚拟的,但它定义于:
class SharedServiceHandler : virtual public SharedServiceIf {
void getStruct(SharedStruct& _return, const int32_t key) {
// Your implementation goes here
printf("getStruct\n");
}
}
这是编译错误:
Calculator_server.skeleton.cpp:49:63: error: cannot allocate an object of abstract type 'CalculatorHandler'
shared_ptr<CalculatorHandler> handler(new CalculatorHandler());
^
Calculator_server.skeleton.cpp:19:7: note: because the following virtual functions are pure within 'CalculatorHandler':
class CalculatorHandler : virtual public CalculatorIf {
^
In file included from Calculator.h:12:0,
from Calculator_server.skeleton.cpp:4:
SharedService.h:18:16: note: virtual void shared::SharedServiceIf::getStruct(shared::SharedStruct&, int32_t)
virtual void getStruct(SharedStruct& _return, const int32_t key) = 0;
所以问题就出现了:这是thrift的CPP代码生成器中的一个错误,它无法正确识别所需的基类,或者我做错了什么?
(这个问题不关于修复C ++编译错误,因为这是由thrift生成的所有代码。这个问题是关于节俭的)
答案 0 :(得分:1)
是的,骷髅在服务继承方面存在问题。如果您将该代码与the code in the /tutorial/cpp
folder of the source tree进行比较,您会发现一些值得注意的差异。
我毫不犹豫地建议不要使用骨架代码,但这可能是大多数人真正做的事情。他们使用源树教程和Test Suite代码作为参考。事实上,C ++是唯一生成骨架的目标语言。我认为这个事实本身就说明了很多。