vc6到vs2010移植错误

时间:2013-04-12 04:34:28

标签: c++ visual-studio-2010 vc6

我被困在将我的项目从VC6移植到VS2010。请任何人帮助我。

void CEdchLoop::ReceiveSdu(UINT8* Sdu, UINT32 BitLength, int Fn)
{
UINT8* pPdu   = Sdu;
    int Bit       = 8;

    UINT32 SourceId    = GetBitsL(pPdu, BitLength, Bit, 32);
    UINT32 PduUniqueId = GetBitsL(pPdu, BitLength, Bit, 32);       
}

在上面的代码中我得到错误错误C2664:'GetBitsL':无法将参数1从'UINT8 *'转换为'const UINT8 *&'

和GetBitsL定义为UINT32 GetBitsL(const UINT8*& Bin, UINT32& BitLength, int& Bit, int Count)

任何人都可以帮助我。我很抱歉,如果这不是一个很棒的问题。但是傻到五分钟比永远傻瓜好。

提前致谢。

2 个答案:

答案 0 :(得分:1)

GetBitsL需要引用指向const-UINT8的指针。你给它一个指向volatile-UINT8的引用,并没有直接的by-reference转换。通过以下方式将pPdu更改为:

// UINT8* pPdu   = Sdu;
const UINT8* pPdu(Sdu);

它仍然被初始化为与UINT8相同的Sdu,但现在作为函数所需的指向const-UINT8的指针。该函数仍然可以修改指针,但不能修改指向的内容。 (这应该暗示您可能没有将该功能用作设计意图,所以请考虑一下。)

答案 1 :(得分:1)

最好通过演示解释问题:

int * ip;
const int *& cipr = ip;

好的,此时cipr是对ip的引用。这不合法,您将在以下部分中看到原因。

const int * cip = some_const_data;
cipr = cip;

该赋值是合法的,因为作为(引用)指向const数据的指针,允许将cipr指定为指向const数据。但正因为如此,由于cipr是对ip的引用,现在ip指向const数据。这是一个问题:

*ip = 7;

这是合法的,因为ip的类型是指向非const int的指针。但是,通过上面的一些技巧,我们指出了const数据。这是不允许的,所以我们的初始陈述,我们绑定cipr来引用ip必须是非法的。通过将pPdu传递给GetBitsL,您尝试做同样的事情。