“不匹配'operator ='in”,结构错误C ++

时间:2011-10-14 20:59:26

标签: c++ struct operators

当我在g ++下编译时,我得到以下错误:

  

在功能'int search(int, int, int)'中:

     

1584:错误:与'operator='

中的'* tt = & core.<anonymous union>::tt[((hash_stack[ply] >> 16) & 2047ul)]'不匹配      

1584:错误:注意:候选人是:

     

118:注意:tt_type& tt_type::operator=(const tt_type&)

     

118:注意:参数1从'tt_type*''const tt_type&'

没有已知转换
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_type                  *tt;                              //LINE 1584
    int                             oldalpha = alpha;
    int                             oldbeta = beta;
    int                             i, count=0;

    nodes++;

    /* test for draw by repetition */
    hash_stack[ply] = compute_hash();
    for (i=ply-4; i>=board[LAST]; i-=2) {
        if (hash_stack[i] == hash_stack[ply]) count++;
        if (count>=2) return 0;
    }

    /*
     *  check transposition table
     */
    *tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];
    if (tt->hash == (hash_stack[ply] & 0xffffU)) {
        if (tt->depth >= depth) {
            if (tt->flag >= 0) alpha = MAX(alpha, tt->score);
            if (tt->flag <= 0) beta = MIN(beta,  tt->score);
            if (alpha >= beta) return tt->score;
        }
        best_move = tt->move & 07777;
    }

我之前定义的地方

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

5 个答案:

答案 0 :(得分:2)

错误消息中最重要的一行是:

118:note: no known conversion for argument 1 from 'tt_type*' to 'const tt_type&'

它实质上意味着您正在尝试分配指向引用的指针。

这反过来让我认为将代码中的* tt = & core.::tt[((hash_stack[ply] >> 16) & 2047ul)]更改为* tt = core.::tt[((hash_stack[ply] >> 16) & 2047ul)]以获取深层副本或将tt = & core.::tt[((hash_stack[ply] >> 16) & 2047ul)]更改为浅副本将解决问题(取决于您的观点)。< / p>

答案 1 :(得分:2)

我怀疑你的第1584行确实是这一行:

*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];

*tt的类型为struct tt_type。 RHS的格式为&...,因此它具有某种指针类型。您可以为结构或指针指定结构,但不能将指针值赋给结构(除非您重载了赋值运算符)。

我没有对代码进行足够深入的了解,但您可能希望将*tt = ...更改为tt = ...

答案 2 :(得分:1)

*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];

您正在尝试将指针存储到不是指针的变量中。

你需要

*tt = TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];

制作数组的一个元素的副本(这不起作用,因为tt未初始化)

tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];

制作指向数组的指针。

编写第二个版本的另一种方法是

tt = TTABLE + ((hash_stack[ply]>>16) & (CORE-1));

答案 3 :(得分:0)

在这一行:

*tt = &TTABLE[ ((hash_stack[ply]>>16) & (CORE-1)) ];

您正尝试将类型tt_type的变量分配给其他类型的其他内容。我不知道TTABLE是什么,但作为一个疯狂的猜测,请尝试删除&(如果&TTABLE的数组tt_type会导致错误1}} s。您要尝试将tt_type*分配给tt_type

答案 4 :(得分:0)

*tt = &TTABLE[/**/];

您是从指针分配结构。由no known conversion for argument 1 from'tt_type*' to 'const tt_type&'澄清它无法将tt_type*转换为tt_type&来制作副本。

我不知道TTABLE是什么,但我会从中移除&