2010-04-23 3 views
3

un peu de mal avec cela.Une référence qui est de ne pas « const » ne peut pas être lié à un non-Am lvalue

Am déclarant:

BYTE *pImage = NULL; 

utilisé dans l'appel:

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

Visual C++ 2003 erreur du compilateur:

error C2664: 'CJrvdInterface::GetImage' : cannot convert parameter 3 from 'BYTE **__w64 ' to 'BYTE **& ' A reference that is not to 'const' cannot be bound to a non-lvalue

La méthode appelée est définie comme:

void CMyInterface::GetImage(const int &a_iTileId, ULONG *a_pulImageSize, 
          BYTE** &a_ppbImage) 

Toute aide très appréciée, Bert

Répondre

8

Parce que GetImage peut modifier son troisième paramètre, vous devez donner quelque chose à modifier:

BYTE **ppImage = &pImage; 
m_pMyInterface->GetImage(i, &imageSize, ppImage); 

Il est possible que, après votre retour de la fonction, que &pImage et ppImage ne peut plus être la même (ce qui signifie également que pImage et *ppImage peut être différent). Si vous ajoutez ceci:

if (ppImage) 
    pImage = *ppImage; 

après l'appel, vous devriez être bon.

Si CMyInterface::GetImage est votre propre fonction, en fonction de ce que vous faites, vous pourriez être en mesure de le changer. Dans votre fonction, avez-vous jamais faire:

a_ppbImage = ...; 

ou écrivez-vous seulement:

*a_ppbImage = ...; 

Si vous faites seulement que celui-ci et non l'ancien, en passant une référence à un double pointeur est surpuissant. Vous pouvez passer une référence à un seul pointeur (BYTE *&image) ou vous pouvez passer un double pointeur (BYTE **image)

0

Si vous essayez de modifier la variable 'pImage' dans la méthode 'GetImage()', vous devez soit passer un pointeur ou une référence à celui-ci (ne pas faire les deux).

Qu'est-ce que vous voulez sans doute est:

BYTE *pImage = NULL; 
x.GetImage(iTileId, pulImageSize, a_pImage); 

Avec la méthode définie comme:

void CMyInterface::GetImage(int const& a_iTileId, ULONG* a_pulImageSize, BYTE*& a_ppbImage) 
{ 
} 

PS. Soyez cohérent lorsque vous mettez votre & et * dans les déclarations de type.

ULONG *a_pulImageSize // Star on the right 
BYTE** &a_ppbImage  // Star on the left (not consistent) 

Personnellement (et ce n'est que mes autres de style sont différents) je mets tout sur la gauche (avec le type) que le nom de la variable conTInuE droite.

0

Vous avez déclaré GetImage() pour attendre une référence à un octet **.

void CMyInterface::GetImage(const int &a_iTileId, 
          ULONG *a_pulImageSize, 
          BYTE** &a_ppbImage); 

Vous avez passé une référence à un octet *.

BYTE *pImage = NULL; 
m_pMyInterface->GetImage(i, &imageSize, &pImage); 

Pour faire votre travail d'appel de méthode comme il est écrit, vous devez changer votre définition de GetImage() pour

void CMyInterface::GetImage(const int &a_iTileId, ULONG *a_pulImageSize, 
          BYTE* &a_ppbImage)