【问题标题】:vc6 to vs2010 porting errorvc6 到 vs2010 移植错误
【发布时间】: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)

请任何人帮助我解决这个问题。如果这不是一个绝妙的问题,我很抱歉。但傻五分钟总比永远傻。

提前致谢。

【问题讨论】:

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


    【解决方案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 的指针。该函数仍然可以修改指针,但不能修改它指向的内容。 (这应该暗示您可能没有按照设计意图使用该功能,因此请考虑一下)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多