C++ 原型c++;实施——”;标记为‘;覆盖’;,但并不凌驾于;错误

C++ 原型c++;实施——”;标记为‘;覆盖’;,但并不凌驾于;错误,c++,protocol-buffers,grpc,C++,Protocol Buffers,Grpc,类InvoiceTemplateMatcher::Service在编译时从该.proto文件生成 当我试图编译时,我得到一个错误 // api_internal.proto service InvoiceTemplateMatcher { rpc Process(InvoiceFilePath) returns (UploadStatus) {} } message InvoiceFilePath { string invoice_id = 1; string file_pa

InvoiceTemplateMatcher::Service
在编译时从该
.proto
文件生成

当我试图编译时,我得到一个错误

// api_internal.proto
service InvoiceTemplateMatcher {
   rpc Process(InvoiceFilePath) returns (UploadStatus) {}
}

message InvoiceFilePath {
   string invoice_id = 1;
   string file_path = 2;
}

// template_matcher/src/main.cc
class OrkaEngineInvoiceTemplateMatcherImpl final : public InvoiceTemplateMatcher::Service {
private:
    Status Process(
        ServerContext* context,
        orka_engine_internal::InvoiceFilePath* invoicefp,
        orka_engine_internal::UploadStatus* response) override {
    // do stuff
    }
};

据我所知,我的代码是以与中相同的方式编写的。我遗漏了什么?

当函数未在基类中标记为
virtual
时,编译器会发出此类错误

考虑以下最小示例:

‘grpc::Status OrkaEngineInvoiceTemplateMatcherImpl::Process(grpc::ServerContext*, orka_engine_internal::InvoiceFilePath*, orka_engine_internal::UploadStatus*)’ marked ‘override’, but does not override
     Status Process(ServerContext* context, orka_engine_internal::InvoiceFilePath* invoicefp, orka_engine_internal::UploadStatus* response) override {
编译器发出以下错误:

class Base{
    void Foo() {}
};

class Derived : Base{
    void Foo() override {}
};
请参见


说明符指定一个
virtual
函数覆盖另一个
virtual
函数。

我知道这篇文章已经很老了,但我会为人们在使用protobufs时可能遇到的任何未来疑难解答给出正确答案

您正确地说类实现已经自动生成,并且原Buff+C++生成默认具有这个类函数:

error: 'void Derived::Foo()' marked 'override', but does not override
     void Foo() override {}

所以您需要将您的函数与虚拟函数精确匹配。在您的示例中,只需将
invoicefp
更改为
request

什么是
InvoiceTemplateMatcher::Service
?它真的有一个
orka\u engine\u internal::UploadStatus*响应)
?该类由protoc自动生成,由cmake调用。应该是这样的,直到我弄乱了服务描述,一切都正常,但我在文件系统上看不到它。即使是自动生成的,你也可以查看生成的代码,没有?我看不到。find/-name“orka\u engine\u internal.grpc.pb.h”未找到任何内容。我缺少插件来手动生成基类来检查它们,现在就开始尝试;我真的无法控制。也可能是签名不匹配吗?派生类呢?它也生成了吗?不,我写的是OrkaEngineInvoiceTemplateMatcherImpl。为了记录此错误的另一个原因,我的函数在基类中被标记为虚拟函数,但派生类中该函数的签名与基类中的签名不同。这不容易理解,因为派生类中有许多typedef。
virtual ::grpc::Status Process(::grpc::ServerContext* context, const ::orka_engine_internal::InvoiceFilePath* request, ::orka_engine_internal::UploadStatus* response);