首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaCPP在函数消歧时失败

JavaCPP在函数消歧时失败
EN

Stack Overflow用户
提问于 2019-08-03 14:19:19
回答 1查看 196关注 0票数 0

我正在使用C++实现JavaCPP项目的Java包装器。我已经为所有自定义类型定义了映射,但是我很难调用以函数作为参数的std::sort_heap()函数。

这是C++代码中的函数调用:

代码语言:javascript
复制
std::sort_heap(heap.begin(), heap.end(), comparePairs);

comparePairs在此文件中声明如下:

代码语言:javascript
复制
bool comparePairs(
  const std::pair<real, int32_t>& l,
  const std::pair<real, int32_t>& r) {
    return l.first > r.first;
}

当我尝试用JavaCPP (使用JavaCPP Maven插件)运行这个程序时,我得到了以下错误:

代码语言:javascript
复制
error: no matching function for call to ‘pop_heap(std::vector<std::pair<float, int> >::iterator, std::vector<std::pair<float, int> >::iterator, <unresolved overloaded function type>)’
   std::pop_heap(heap.begin(), heap.end(), comparePairs);
                                                       ^

更新:问题似乎是由于在另一个文件中声明了另一个签名函数稍有不同的compairePairs()。考虑到每个C++函数只在同一个文件中调用,compairePairs()编译器可以很好地消除它们的歧义。然而,JavaCPP似乎在某种程度上无法消除歧义。

其他类型的映射就是这样声明的:

代码语言:javascript
复制
import org.bytedeco.javacpp.tools.Info;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;
[...]

@Properties(value = @Platform(include = {[...]}), target = "[...]")
public class Wrapper implements InfoMapper {
  public void map(InfoMap infoMap) {
    infoMap.put(new Info("std::vector<std::string>").pointerTypes("StringVector").define())
       // more put calls here
       ;
  }
}

因此,问题是:为什么JavaCPP不能消除重载函数的歧义,以及如何修复它?

注意: C++代码是一个第三方项目,因此更改C++代码不是一个选项。

更新:这些问题似乎是由于compairPairs()函数在C++代码中被声明了两次(在两个不同的文件中),具有不同的签名。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-25 12:38:02

如注释中所述,将对comparePairs()的函数调用包装到lambda函数可以解决这个问题。

请参阅https://github.com/facebookresearch/fastText/pull/936/commits/cda295f1b5851df0a26a6ac2ab04230fb864a89d

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57339143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档