C++ 不指向';常数';无法绑定到非左值

C++ 不指向';常数';无法绑定到非左值,c++,constants,C++,Constants,我对此有些挣扎 我宣布: BYTE *pImage = NULL; 用于呼叫: m_pMyInterface->GetImage(i, &imageSize, &pImage); Visual C++ 2003编译器错误: 错误C2664:“CJrvdInterface::GetImage”:无法将参数3从“BYTE**\uu w64”转换为“BYTE**&” 不指向“const”的引用不能绑定到非左值 调用的方法定义为: void CMyInterface::Get

我对此有些挣扎

我宣布:

BYTE *pImage = NULL;
用于呼叫:

m_pMyInterface->GetImage(i, &imageSize, &pImage);

Visual C++ 2003编译器错误:

错误C2664:“CJrvdInterface::GetImage”:无法将参数3从“BYTE**\uu w64”转换为“BYTE**&” 不指向“const”的引用不能绑定到非左值

调用的方法定义为:

void CMyInterface::GetImage(const int &a_iTileId, ULONG *a_pulImageSize, 
                            BYTE** &a_ppbImage)
void CMyInterface::GetImage(int const& a_iTileId, ULONG* a_pulImageSize, BYTE*& a_ppbImage)
{
}
非常感谢您的帮助,
Bert

因为GetImage可以修改它的第三个参数,所以您需要给它一些要修改的内容:

BYTE **ppImage = &pImage;
m_pMyInterface->GetImage(i, &imageSize, ppImage);
函数返回后,
&pImage
ppImage
可能不再相同(这也意味着
pImage
*ppImage
可能不同)。如果您添加以下内容:

if (ppImage)
    pImage = *ppImage;
打电话之后,你应该很好

如果
CMyInterface::GetImage
是您自己的函数,则根据您的操作,您可以对其进行更改。在您的职能中,您是否曾经:

a_ppbImage = ...;
或者你只写:

*a_ppbImage = ...;

如果只做后者而不做前者,那么将引用传递给双指针就太过分了。您可以传递对单个指针(
BYTE*&image
)的引用,也可以传递双指针(
BYTE**image

如果您试图修改方法“GetImage()”中的变量“pImage”,则应该传递指针或对它的引用(不能同时传递指针或引用)

您可能想要的是:

BYTE *pImage = NULL;
x.GetImage(iTileId, pulImageSize, a_pImage );
方法定义为:

void CMyInterface::GetImage(const int &a_iTileId, ULONG *a_pulImageSize, 
                            BYTE** &a_ppbImage)
void CMyInterface::GetImage(int const& a_iTileId, ULONG* a_pulImageSize, BYTE*& a_ppbImage)
{
}
注意:在类型声明中放置&和*时要保持一致

ULONG   *a_pulImageSize   // Star on the right
BYTE**   &a_ppbImage      // Star on the left (not consistent)
就我个人而言(这只是我的风格,其他人则不同),我把所有的东西都放在左边(带类型),只是变量名放在右边。

您声明GetImage()期望引用一个字节**

void CMyInterface::GetImage(const int &a_iTileId, 
                            ULONG *a_pulImageSize,
                            BYTE** &a_ppbImage);
您向它传递了对字节*的引用

BYTE *pImage = NULL;
m_pMyInterface->GetImage(i, &imageSize, &pImage);
要使方法调用按编写的方式工作,需要将GetImage()的定义更改为