参考号为';用C++; 我正在编写一个C线束来调用C++ API。我有以下代码: Boxa *tess_get_text_lines(tess_api_t *api, const bool raw_image, const int raw_padding, Pixa** pixa, int **blockids, int **paraids) { return api->tess_api->GetTextlines(raw_image, raw_padding, pixa, blockids, paraids); }

参考号为';用C++; 我正在编写一个C线束来调用C++ API。我有以下代码: Boxa *tess_get_text_lines(tess_api_t *api, const bool raw_image, const int raw_padding, Pixa** pixa, int **blockids, int **paraids) { return api->tess_api->GetTextlines(raw_image, raw_padding, pixa, blockids, paraids); },c++,pass-by-reference,compiler-optimization,C++,Pass By Reference,Compiler Optimization,我收到以下G++错误: $ ./build_so.sh tesseract.cpp: In function ‘Boxa* tess_get_text_lines(tess_api_t*, bool, int, Pixa**, int**, int**)’: tesseract.cpp:172:47: error: no matching function for call to ‘tesseract::TessBaseAPI::GetTextlines(const bool&, co

我收到以下G++错误:

$ ./build_so.sh 
tesseract.cpp: In function ‘Boxa* tess_get_text_lines(tess_api_t*, bool, int, Pixa**, int**, int**)’:
tesseract.cpp:172:47: error: no matching function for call to ‘tesseract::TessBaseAPI::GetTextlines(const bool&, const int&, Pixa**&, int**&, int**&)’
tesseract.cpp:172:47: note: candidate is:
In file included from tesseract.cpp:3:0:
/usr/include/tesseract/baseapi.h:376:9: note: Boxa* tesseract::TessBaseAPI::GetTextlines(Pixa**, int**)
/usr/include/tesseract/baseapi.h:376:9: note:   candidate expects 2 arguments, 5 provided
我的呼叫与正确的过载不匹配。以下是所调用方法的可用重载,以供参考:

Boxa* GetTextlines(const bool raw_image, const int raw_padding,
                   Pixa** pixa, int** blockids, int** paraids);
Boxa* GetTextlines(Pixa** pixa, int** blockids);
为什么我的调用被翻译成“GetTextlines(constbool&,constint&,Pixa*&,int*&,int**&)”(带有所有的by-ref'ing)


谢谢。

编译器不会自动引入引用。相反,需要注意的是,您提供的参数是左值,并试图找到一个重载,如果提供了引用类型,该重载将起作用。(请注意,提供的类型是有关传递到函数中的类型的信息,而不是函数签名中的实际类型。)

也就是说,错误确实会为您提供解决问题所需的信息。请注意,它说的第一种类型是
constbool
,但是您尝试调用的函数采用
tess\u api\u t*
。我认为您可能需要更改调用函数的方式


希望这有帮助

事实证明,尽管Tesseract已经存在了18年,但我一直使用的主干版本自今年早些时候发布的最新可下载版本(3.02.02)以来,尽管遇到了种种困难,还是被赋予了一些额外的重载


因此,对于报告的问题的答案是,正如@templatetypedef所指出的,GCC很可能只是为了错误消息的好处而用符号修饰变量。我遇到的有效问题的答案很简单,就是我没有查看API头的同步副本。

摆脱重载。将GetTextLines(您不调用的版本)的第二个声明/定义重命名为“GetTextLines2”或其他名称。这不会解决您的问题,但会生成有关您正在调用的GetTextLines版本的更好的错误消息。我正在调用由第三方开发的已建立的库。我无法控制它。但是你可以临时修改头文件中的方法声明,只是为了克服模棱两可的编译错误。然而,这并不是一个修复方法,而是一个系统无用的权宜之计。。。。随后的编译将导致不同的错误消息。这将为您提供一个更好的线索,解释为什么编译器无法解析对GetTextLines的调用。修复隐藏过载版本的GetTextLines后保证存在的后续错误。然后恢复黑客攻击。这就是我要说的。我的适配器需要一个tess_api,但不是我试图调用的对象(请参见底部的重载)。谢谢你的其他见解。他们很有帮助。