如何修复“一元*”的无效类型参数?

时间:2011-10-13 03:26:46

标签: c++

好的,所以我重新发布此内容,但也包括更新,可能违反规则,但我找不到任何其他方法。有人要求我的课程描述,我无法弄清楚如何添加它,所以如果有人可以帮我弄清楚如何编辑我的帖子,也将非常感激。 因此,在使用此代码

时,我遇到了错误“'unary *'的无效类型参数”
static int cmp_bk( const void *ap, const void *bp)
{
    int a; 
    int b;
    dynamic_cast<const struct bk>(*a)=ap;
    dynamic_cast<const struct bk>(*b)=bp;

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

我得到的确切错误是:

'unary *'的无效类型参数

并且它设置为两行

dynamic_cast<const struct bk>(*a)=ap;
dynamic_cast<const struct bk>(*b)=bp;

所以有人告诉我用reinterpret_cast而不是动态重写它,但一直得到“未检查”的变量,所以我只是开始做一些工作让事情发生,所以我知道这是错的,这是我目前的结果新错误“预期在'之前的初级表达' - &gt;'令牌“为所有' - &gt;'令牌。

static int cmp_bk( const void *ap, const void *bp)
{
   class bk {};
   class pa {};
   class pb {};
   class a {};
   class b {};
   bk * pa;
   bk * pb;
    ap = reinterpret_cast<bk*>(pa);
    bp = reinterpret_cast<bk*>(pb);

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

我的bk类也在静态联合中,所以这里就是全部。

 /* Transposition table and opening book share the same memory */
 static union {
 #define TTABLE (core.tt) 
    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];
 #define BOOK (core.bk)       
    struct bk {                     /* Opening book entry */
            unsigned long hash;     /* - Identifies position */
            short move;             /* - Move for this position */
            unsigned short count;   /* - Frequency */
    } bk[CORE];
} core;

//#define TTABLE (core.tt)
//#define BOOK (core.bk)

希望这是人们需要的所有信息,正如我所说的,如果有人也可以帮我编辑我的帖子,那么我就不必再制作一个值得高度赞赏的新帖子了。并感谢大家的帮助,这些帮助在最后一篇文章中得到了帮助,并在这篇新文章中提供了帮助。

2 个答案:

答案 0 :(得分:0)

在这一行:

dynamic_cast<const struct bk>(*a)=ap;

您正在尝试取消引用int。只有指针和具有重载运算符*的类才能被取消。

答案 1 :(得分:0)

直接回答您的问题:

const bk& a_bk = *reinterpret_cast<const bk*>(ap);
const bk& b_bk = *reinterpret_cast<const bk*>(bp);

其次,代码:

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

可以缩减为:

if ( a_bk.hash < b_bk.hash ) return -1;
else if (a_bk.hash > b_bk.hash ) return 1;
else return 0;

或者只是:

return a_bk.hash - b_bk.hash;

第三,使用类型安全的排序函数而不是使用不安全的C风格排序函数:

int sort_bk_by_hash( const bk& lhs, const bk& rhs ) {
    return rhs.hash - lhs.hash;
}

// then use like so:
set<bk,sort_bk_by_hash> data;

// or:
vector<bk> data;
sort( data.begin(), data.end(), sort_bk_by_hash );

第四,如何在没有某种类型字段的情况下激活联合内部的哪个结构?可以从哈希值推断出类型吗?

最后,您可以通过boost::variant完成任何操作。