错误C2663:重载没有'this'指针的合法转换

时间:2012-07-29 12:20:56

标签: c++ compiler-errors

请帮我解决这个错误

代码:

u16 ip_defragment(){
    u16 result;
    fragip_set::iterator i;
    IP_FRAGMENTED new_defrag;
    IP* pcurpack = (IP*) malloc(cur.len);
    memcpy(pcurpack, cur.data, cur.len);
    new_defrag.saddr = cur.saddr;
    new_defrag.daddr = cur.daddr;
    new_defrag.protocol = cur.ip.ppack->protocol;
    new_defrag.id = i2i(cur.ip.ppack->id);

    i = ip_frags.find(new_defrag);

    if(i != ip_frags.end()){
            i->packets.insert(pcurpack);
            const_cast<u16&>(i->cur_len) += cur.ip.len - cur.ip.hlen; 
            const_cast<u32&>(i->last_time) = time();
            if(!(cur.ip.bmore_fr) && (i->tot_len == 0)){
            const_cast<u16&>(i->tot_len) = cur.ip.fr_offs + cur.ip.len;
            }
            if(i->cur_len == i->tot_len){
                for(set<IP*>::iterator k = i->packets.begin(); k != i->packets.end(); k++){
                    // must copy to another buffer
                    if(i2i((*k)->frag_off) & IP_OFFMASK){
                        memcpy(ip_defrag_buffer, *k, (*k)->ihl<<2);
                    } else {
                        memcpy(ip_defrag_buffer + (i2i((*k)->frag_off) & IP_OFFMASK) * 8, 
                            *k + ((*k)->ihl<<2), (i2i((*k)->tot_len))-((*k)->ihl<<2));
                    }
                }
                IP* defr_ip = (IP*) &ip_defrag_buffer;
                defr_ip->tot_len = i2i(i->tot_len);
                defr_ip->frag_off = 0;
                result = i->tot_len;
                ip_frags.erase(i);
                return result;
            }
            return 0;
    }


    if(!(cur.ip.bmore_fr)){
        new_defrag.tot_len = cur.ip.fr_offs + cur.len;
    } else {
        new_defrag.tot_len = 0;
    }
    new_defrag.cur_len = cur.ip.len; // with header size
    new_defrag.last_time = time();
    i = ip_frags.insert(new_defrag).first;
    if(i != ip_frags.end())
        i->packets.insert(pcurpack);

    return 0;
}

编译项目并仅查看2个类似的错误

第15行:i->packets.insert(pcurpack);

结束行:i->packets.insert(pcurpack);

2行错误:错误C2663:'std :: _ Tree&lt; _Traits&gt; :: insert':4个重载没有'this'指针的合法转换

IntelliSense: no instance of overloaded function "std::set<_Kty, _Pr, _Alloc>::insert [with _Kty=IP *, _Pr=std::less<IP *>, _Alloc=std::allocator<IP *>]" matches the argument list and object (the object has type qualifiers that prevent a match)

请帮帮我?

1 个答案:

答案 0 :(得分:0)

我与std :: set完全相同的错误,同时将它传递给lambda表达式:

C2663 'std::_Tree<std::_Tset_traits<_Kty,_Pr,_Alloc,false>>::insert': 5 overloads have no legal conversion for 'this' pointer

lambda表达原型是:

[se1, ele1](auto val) {
    /* here I was editing se1 set, but above se1 is passed value type */
}

我已改为:

[&se1, ele1](auto val) {
    /* now since se1 set is sent as reference type above, it is good to edit
       changes stays as I expect it to be
    */
}

现在编译成功了。

我使用count_if函数,它调用eac元素的lamda表达式,因此编译器知道修改应该在set se1中保留,这是完全合乎逻辑的。

如果您希望原始设置保持不变,请发送一份副本。