0

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 は奇妙に定義されています。投稿してみます。

4

3 に答える 3

0

refresh_listエラー メッセージに表示される の宣言は次のとおりです。

dessert_per_result_t refresh_list();

これは、C++ と C では 2 つの異なることを意味します。

C++ では、refresh_list引数がゼロであることを意味します。

C では、refresh_list不特定の型の不特定の数の引数を取ることを意味します。

したがって、Cでは機能しましたが、C ++では、へのポインターが期待されるrefresh_list場所へのポインターは許可されていません。dessert_per_result_t(void *, struct timeval *, struct timeval *)

以下も参照してください。

于 2013-06-10T16:52:59.317 に答える