library example c++ reference char

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; }