c++ - "Candidate function not viable;"将 C 库移植到 C++ 的问题

标签 c++ c porting

我正在尝试在 C++ 实现中使用 C 库,但我经常遇到与“候选函数不可行”有关的错误,并且似乎认为库中的函数无法使用所提供的参数运行在我的代码中。问题是,我的代码实际上是一个旧的实现(在 c 中),在用 c 编译时工作得很好。有没有办法让这个编译成为我的 C++ 环境的一部分?

这是我得到的错误:

testbed/des-lsr_routinglogic.cpp:20:27: error: no matching function for call to 'dessert_periodic_add'
periodic_refresh_nh = dessert_periodic_add(refresh_list, NULL, NULL, &refresh_neighbor_t);
                      ^~~~~~~~~~~~~~~~~~~~
/usr/local/include/dessert.h:880:21: note: candidate function not viable: no known conversion from 'dessert_per_result_t ()' to 'dessert_periodiccallback_t *' (aka 'dessert_per_result_t (*)(void *, struct
  timeval *, struct timeval *)') for 1st argument
dessert_periodic_t* dessert_periodic_add(dessert_periodiccallback_t* c, void* data, const struct timeval* scheduled, const struct timeval* interval);
                ^

从这行代码代码:

periodic_refresh_nh = dessert_periodic_add(refresh_list, NULL, NULL, &refresh_neighbor_t);

使用该库的摘录:

dessert_periodic_t* dessert_periodic_add(dessert_periodiccallback_t* c, void* data,     const struct timeval* scheduled, const struct timeval* interval);
dessert_periodic_t* dessert_periodic_add_delayed(dessert_periodiccallback_t* c, void* data, int delay);
int dessert_periodic_del(dessert_periodic_t* p);
void dessert_register_ptr_name(void* ptr, const char* name);
const char* dessert_ptr2name(void* ptr);

我认为编译器输出对于任何有结合 c/c++ 经验的人来说应该是不言自明的,但对我来说它看起来像胡言乱语 D:

编辑

谢谢,有人向我指出我遗漏了一些重要的定义; refresh_list的定义:

 dessert_per_result_t refresh_list(void *data, struct timeval *scheduled, struct timeval *interval) {
pthread_rwlock_wrlock(&pp_rwlock);
node_neighbors_t *neighbor = dir_neighbors_head;
while (neighbor) {
    if (neighbor->entry_age-- == 0) {
        node_neighbors_t* el_to_delete = neighbor;
        HASH_DEL(dir_neighbors_head, el_to_delete);
        free(el_to_delete);
    } else {
        neighbor->weight = 1;
    }
    neighbor = neighbor->hh.next;
}
pthread_rwlock_unlock(&pp_rwlock);
return 0; }

dessert_per_result_t的定义:

 typedef enum _dessert_periodic_results { DESSERT_PER_KEEP = 0, DESSERT_PER_UNREGISTER = 1 } dessert_per_result_t;

dessert_periodiccallback_t 的定义很奇怪;我会尝试发布它。

最佳答案

C++ 在函数声明方面比 C 更严格。在这种情况下,函数 refresh_list 被声明为 dessert_per_result_t refresh_list(),但是 dessert_periodic_add 的第一个参数 必须是指向具有明确指定参数类型的函数的指针。

解决此问题的最佳方法是添加 refresh_list 的完整声明,以匹配 dessert_periodic_add 的预期,以代替它的缩写声明。

关于c++ - "Candidate function not viable;"将 C 库移植到 C++ 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17023821/

相关文章:

c++ - 如何弄清楚为什么 UDP 仅以相对较慢的速率接受数据包?

c++ - 将 C++ 应用程序从 XP 移植到 Vista/7

c++ - 列表迭代器不可取消引用

c++ - 错误 : 'set' was not declared in this scope

android - 使用独立工具链编译的 Libogg(由 NDK 脚本生成)尝试从不正确的文件加载自身 - libogg.so.0 而不是 libogg.so

c - MinGW 不输出可执行文件或目标文件

android - 如何将 android 应用程序移植到黑莓?

c++ - 使用 Makefile 和 GTest 对函数的 undefined reference

c++如何保存临时变量的使用

c - 在 Linux 上分配期间如何记录堆栈?