I've been working on porting Marcel’s Simple Chess Program http://marcelk.net/mscp/ from C to C++. I have never worked much with unions, much less structs within unions. The top part I've listed is the declaration of the union. (All the code is in one .c file).
I've searched and read a few guides in addition to a C++ textbook, but I still have not gained any insight into how this could be fixed. I'm not sure what a "forward cdeclaration" is nor in what context I should be looking at the problem.
My compile options are
g++ -ansi -Wall -O2 -pedantic -o mscp -mscp.cpp
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;
These portions are examples of the lines giving errors:
error: forward declaration of ‘const struct cmp_bk(const void*, const void*)::bk’
error: invalid use of incomplete type ‘const struct cmp_bk(const void*, const void*)::bk’
    static int cmp_bk(const void *ap, const void *bp)
    {
            const struct bk *a = ap; //ERROR HERE
            const struct bk *b = bp; //ERROR HERE
            if (a->hash < b->hash) return -1; //ERROR HERE
            if (a->hash > b->hash) return 1; //ERROR HERE
            return (int)a->move - (int)b->move; //ERROR HERE
    }
static int search(int depth, int alpha, int beta)
{
        int                             best_score = -INF;
        int                             best_move = 0;
        int                             score;
        struct move                     *moves;
        int                             incheck = 0;
        struct tt                       *tt; //ERROR HERE
        int                             oldalpha = alpha;
        int                             oldbeta = beta;
        int                             i, count=0;
               if (tt->depth >= depth) {
                    if (tt->flag >= 0) alpha = MAX(alpha, tt->score); //ERROR HERE
                    if (tt->flag <= 0) beta = MIN(beta,  tt->score); //ERROR HERE
                    if (alpha >= beta) return tt->score;
            }
            best_move = tt->move & 07777;      
 
    