2013-04-12 59 views
0

我被困在我的项目从VC6到VS2010的移植。请任何人帮助我。vc6 vs 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':不能从 'UINT8 *' 转换参数1至 'const的UINT8 * &'

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

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

在此先感谢。

回答

1

GetBitsL要求引用指向const-UINT8的指针。你给它提供了一个指向volatile的指针UINT8,并且没有直接的参考转换。更改pPdu是由:

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

它仍然是初始化为指向同一UINT8Sdu,但现在作为指针给const-UINT8该函数的期望。该功能仍然可以修改指针,但不会指向指向。 (这应该是暗示你可能没有将该功能用作设计意图,所以考虑这一点)。

1

的问题最好用演示解释说:

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

好吧,在这一点上,ciprip参考。这是不合法的,你会看到为什么在以下部分。

const int * cip = some_const_data; 
cipr = cip; 

即分配是合法的,因为,作为一个(参照)的指针常量数据,cipr允许被分配给指向常数数据。但正因为如此,ciprip的参考,现在ip指向常数数据。这是一个问题:

*ip = 7; 

这是合法的,因为ip类型为指向非const int类型。但是,通过上面的一些技巧,我们将它指向了const数据。这是不允许的,所以我们最初的声明,我们绑定cipr来引用ip必须是非法的。通过将pPdu传递给GetBitsL,您正在尝试做的事情也是如此。