0

我正在编写一个 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**&)”(所有的 by-ref'ing)?

谢谢。

4

2 回答 2

1

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

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

希望这可以帮助!

于 2013-11-09T03:06:21.663 回答
0

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

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

于 2013-11-09T20:40:42.073 回答