2011-10-14 55 views
0

我不斷收到以下錯誤,當我下摹編譯外部可見++(這是一個非常漫長的代碼段)如何使結構類型定義聯合C++


error: invalid use of incomplete type 'const struct cmp_bk(const void*, const void*)::bk'

error: forward declaration of 'const struct cmp_bk(const void*, const void*)::bk'

的代碼如下:

static union { 
    struct tt {      /* Transposition table entry */ 
      unsigned short hash; /* - Identifies position */ 
      short move;    /* - Best recorded move */ 
      short score;   /* - Score */ 
      char flag;    /* - How to interpret score */ 
      char depth;    /* - Remaining search depth */ 
    } tt[CORE]; 
    struct bk {      /* Opening book entry */ 
      unsigned long hash;  /* - Identifies position */ 
      short move;    /* - Move for this position */ 
      unsigned short count; /* - Frequency */ 
    } bk[CORE]; 
} core; 

後來在節目中,我們定義新結構的a,b

static int cmp_bk(const void *ap, const void *bp) 
{ 
    const struct bk *a = (bk*) ap; 
    const struct bk *b = (bk*) bp; 

    if (a->hash < b->hash) return -1; 
    if (a->hash > b->hash) return 1; 
    return (int)a->move - (int)b->move; 

}

我們很可能無法正常訪問的結構BK工會之外

+1

對不起,這不是C++。這裏我們不使用'void *'。或C型演員。或工會。或者比較不是操作員的功能。 –

+3

@CatPlusPlus - 如果你能和我的老闆見面,我會很高興...... – Nate

+1

有沒有什麼理由不能在union之外定義/ typedef bk結構? – IronMensan

回答

2

你可以只聲明結構工會之外(?):

struct tt {      /* Transposition table entry */ 
     unsigned short hash; /* - Identifies position */ 
     short move;    /* - Best recorded move */ 
     short score;   /* - Score */ 
     char flag;    /* - How to interpret score */ 
     char depth;    /* - Remaining search depth */ 
}; 
struct bk {      /* Opening book entry */ 
     unsigned long hash;  /* - Identifies position */ 
     short move;    /* - Move for this position */ 
     unsigned short count; /* - Frequency */ 
}; 

static union { 
    struct tt tt[CORE]; 
    struct bk bk[CORE]; 
} core; 
2

這是一個很難將C代碼編譯爲C++。您不能在匿名類型中定義類型,並期望能夠訪問它。因此,解決此問題後的代碼是

struct tt_type {      /* Transposition table entry */ 
    unsigned short hash; /* - Identifies position */ 
    short move;    /* - Best recorded move */ 
    short score;   /* - Score */ 
    char flag;    /* - How to interpret score */ 
    char depth;    /* - Remaining search depth */ 
}; 

struct bk_type {      /* Opening book entry */ 
    unsigned long hash;  /* - Identifies position */ 
    short move;    /* - Move for this position */ 
    unsigned short count; /* - Frequency */ 
}; 

static union { 
    tt_type tt[CORE]; 
    bk_type bk[CORE]; 
} core; 

static int cmp_bk(const void *ap, const void *bp) 
{ 
    const bk_type *a = (const bk_type*) ap; 
    const bk_type *b = (const bk_type*) bp; 

    if (a->hash < b->hash) return -1; 
    if (a->hash > b->hash) return 1; 
    return (int)a->move - (int)b->move; 
} 

現在,我們來看看這不是C++代碼。首先,這些結構使用起來很麻煩 - 至少要添加構造函數。其次,工會不是類型安全的 - 使用boost::variant代替。第三,cmp_bk。使它operator==(const bk_type&, const bk_type&) - 沒有指針,沒有void*,沒有愚蠢的鑄件。第四,固定大小的數組 - 幾乎總是一個壞主意,引發各種問題。改爲使用std::vector。而現在我已經沒有了我的理智點,所以我會完成。