vc6 到 vs2010 移植错误
Posted
技术标签:
【中文标题】vc6 到 vs2010 移植错误【英文标题】:vc6 to vs2010 porting error 【发布时间】:2013-04-12 04:34:28 【问题描述】:我被困在将我的项目从 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' : cannot convert parameter 1 from 'UINT8 *' to 'const UINT8 *&'
GetBitsL 被定义为UINT32 GetBitsL(const UINT8*& Bin, UINT32& BitLength, int& Bit, int Count)
请任何人帮助我解决这个问题。如果这不是一个绝妙的问题,我很抱歉。但傻五分钟总比永远傻。
提前致谢。
【问题讨论】:
【参考方案1】:这个问题最好用演示来解释:
int * ip;
const int *& cipr = ip;
好的,此时,cipr
是对ip
的引用。这是不合法的,您将在以下部分中了解原因。
const int * cip = some_const_data;
cipr = cip;
这个赋值是合法的,因为作为一个(引用)指向 const 数据的指针,cipr
可以被赋值为指向 const 数据。但正因为如此,由于cipr
是对ip
的引用,现在ip
指向常量数据。这是个问题:
*ip = 7;
这是合法的,因为ip
的类型是指向非常量int 的指针。但是,通过上面的一些技巧,我们让它指向 const 数据。这是不允许的,所以我们最初的声明,我们将cipr
绑定到ip
必须是非法的。这与您通过将pPdu
传递给GetBitsL
来尝试做的事情相同。
【讨论】:
【参考方案2】:GetBitsL
需要引用指向 const-UINT8 的指针。您正在给它一个指向 volatile-UINT8 的引用,并且没有直接的引用转换。将pPdu
更改为:
// UINT8* pPdu = Sdu;
const UINT8* pPdu(Sdu);
它仍然初始化为指向与Sdu
相同的UINT8
,但现在作为函数期望的指向const-UINT8 的指针。该函数仍然可以修改指针,但不能修改它指向的内容。 (这应该暗示您可能没有按照设计意图使用该功能,因此请考虑一下)。
【讨论】:
以上是关于vc6 到 vs2010 移植错误的主要内容,如果未能解决你的问题,请参考以下文章
将 WCF 项目从 VS 2008 移植到 2010 时出错
vs2010和blend 4都装好了,我怎么将Blend 4画的东西移植到我的VS2010 WPF应用程序中呢,请高手指点,谢谢
将托管 C++ 从 vs2003 移植到 vs2008 的问题