奇怪的自动引用C++

Weird automatic by-ref'ing in C++

本文关键字:引用 C++      更新时间:2023-10-16

我正在编写一个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);
}

我收到以下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(const bool&, const int&, Pixa*&, int*&, int**&)"(包括所有引用)?

谢谢。

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

也就是说,该错误确实为您提供了解决问题所需的信息。请注意,它所说的第一种类型是 const bool ,但您尝试调用的函数需要tess_api_t*。我认为您可能需要更改调用函数的方式。

希望这有帮助!

实际上,事实证明,尽管 Tesseract 已经存在了 18 年,但自今年早些时候最新发布的可下载版本 (3.02.02) 以来,我一直使用的 trunk 版本已经获得了许多额外的重载。

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