"Candidate function not viable;" 将 C 库移植到 C++ 时出现问题
"Candidate function not viable;" Issues with porting a C library to C++
我试图在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);
^
从这行代码code:
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; }
甜品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
所期望的相匹配,以取代它的缩写声明。
编译器消息显示编译器认为refresh_list
是一个不带参数的函数,返回一个dessert_per_result_t
。
你发布的定义不同意。
这表明refresh_list
有一个与定义不一致的单独声明
错误信息中显示的refresh_list
的声明如下:
dessert_per_result_t refresh_list();
这在c++和C中意味着两种不同的东西。
在c++中,这意味着refresh_list
不接受任何参数。
在C语言中,这意味着refresh_list
接受未指定类型的未指定数量的参数。
这就是为什么它在C中工作,但在c++中,指向refresh_list
的指针是不允许的,而指向dessert_per_result_t(void *, struct timeval *, struct timeval *)
的指针是需要的。
参见:
- 一劳永逸地理解C和c++中f()和f(void)的区别
- 使用C void参数"void foo(void)"或者不"void foo()"?
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题