example - string c++ library
¿Error de compilación de char*extraño? (7)
¿Hay algún problema con mi código a continuación? ¡Obtuve el error de compilación!
typedef unsigned char BYTE;
void foo(char* & p)
{
return;
}
int main()
{
BYTE * buffer;
// error C2664: ''foo'' : cannot convert parameter 1 from ''char *'' to ''char *&''
foo ((char*)buffer);
return 0;
}
Gracias de antemano, George
Cuando BYTE*
el BYTE*
en char*
, se crea una entidad temporal sin nombre con el tipo char*
. La función que llama toma una referencia a un char*
pero no puede tomar una referencia a dicha entidad temporal porque no es una variable real.
El parámetro de foo es un referencia-a-un-puntero. el búfer es un puntero BYTE. La referencia requiere una coincidencia exacta, no es compatible con la asignación.
Dos soluciones:
1) probablemente no necesites el ''&'' delante de p. Suelto y el código compilará.
2) Use una variable correctamente tipada para que la referencia funcione:
BYTE * buffer;
char * b = (char *) buffer;
foo (b);
buffer = (BYTE*) b; // because foo may change b
El puntero del buffer
es un "lvalue", pero cuando se aplica la operación de conversión, la expresión:
(char*) buffer
es un "rvalue" (en realidad, un "valor variable modificable"), pero creo que eso solo importa en el próximo C ++ 0x). Las referencias no const no pueden vincularse a rvalues.
Sin embargo, las referencias de const se pueden vincular a rvalues. Por lo tanto, se compilará la siguiente modificación de su programa:
void foo(char* const& p) // added ''const''
Stephan T. Lavavej publicó recientemente una entrada de blog que tiene gran información sobre lvalues, rvalues y referencias:
El artículo es realmente acerca de las nuevas "referencias rvalue" que vienen en C ++ 0x, pero tiene una gran explicación de qué son lvalues y rvalues y cómo pueden y no pueden trabajar con referencias en C ++ 98. Es una lectura larga, pero valdrá la pena.
En primer lugar, cuando dices
(char)buffer
Estás mintiendo al compilador: el búfer es un puntero, no un char.
En segundo lugar, incluso si el elenco funcionó, produciría un temporal, que no puede vincularse a una referencia no constante.
Entonces, sí, hay al menos dos cosas mal con tu código.
Escríbelo así:
int main() {
BYTE * buffer;
char* pbuf = (char*)buffer;
foo(pbuf);
}
Está intentando pasar una referencia de variable, pero no hay una variable de tipo char * a la que pueda hacer referencia.
Debería funcionar de esta manera si no recuerdo mal:
BYTE * buffer;
char* ptr = (char*)buffer;
foo(ptr); // now you have a matching variable to refer to.
Tal vez sería más fácil pasar un valor en lugar de una referencia.
Puede realizar un reinterpret_cast<char*&>
lugar de un molde estático
foo (reinterpret_cast<char*&>(buffer));
O bien, puede hacer que el argumento sea una referencia constante:
void foo(char* const & p)
{
return;
}