C++ 実装で ac ライブラリを使用しようとしていますが、「候補関数が実行可能ではありません」というエラーが頻繁に発生し、ライブラリ内の関数がコードに示されている引数では機能しないと思われるようです. 問題は、私のコードは文字通り古い実装 (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; }
Desert_per_result_t の定義:
typedef enum _dessert_periodic_results { DESSERT_PER_KEEP = 0, DESSERT_PER_UNREGISTER = 1 } dessert_per_result_t;
Desert_periodiccallback_t は奇妙に定義されています。投稿してみます。