我被困在将我的项目从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)
任何人都可以帮助我。我很抱歉,如果这不是一个很棒的问题。但是傻到五分钟比永远傻瓜好。
提前致谢。
答案 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
,您尝试做同样的事情。