2010-10-14 27 views
6

¿Por qué la C++/CLI de Microsoft no me permite pasar cadenas por referencia? He recibido el siguiente error:C++/CLI: ¿Por qué no puedo pasar cadenas por referencia?

C3699: '&': no ​​se puede utilizar este tipo de direccionamiento indirecto en 'Sistema :: string'

+1

que añade el C++ - etiqueta cli porque parece que eso es lo que eres usando aquí. – configurator

+0

Solo como punto de referencia: C++/CLI es * no * C++; a pesar de la similitud en los nombres, las etiquetas C++ y C++ - cli son bastante parecidas a mutuamente excluyentes; las preguntas sobre una (incluida esta) a menudo no tienen sentido con respecto a la otra. –

Respuesta

11

Parece que está usando Managed C++, que es un C++ bastardised que se usa con .NET Framework.

en C++ administrado, creo que la sintaxis que está buscando es System::String^. La razón de esto es que dado que los tipos administrados son basura recolectada por .NET Framework, no está permitido crear referencias 'regulares' ya que el GC necesita rastrear todas las referencias a una variable específica para saber cuándo es seguro liberarla. .

+10

+1 for * bastardised * – karlphillip

+1

estoy con karlphillip – dutt

+0

Eche un vistazo al tutorial de Microsoft sobre Data Marshaling para una discusión en profundidad sobre cómo se gestiona la memoria entre C/C++ nativo y C++ administrado. http://msdn.microsoft.com/en-us/library/ms384317(VS.71).aspx – jwadsack

0

Parece que está usando C++ administrado. Debería usar System :: String^en su lugar.

+0

+1 para contrarrestar el voto atrasado. – dalle

+0

@dalle, Thanks :) – leiz

26

En primer lugar, existen realmente dos dialectos C++ específicos de Microsoft para .NET: el anterior "Managed C++" (Visual Studio 2002 y 2003) y C++/CLI (Visual Studio 2005 y posterior).

En C++/CLI, System::String^ es una referencia .NET a una cadena; algunos autores lo llaman un "puntero de seguimiento" para compararlo y contrastarlo con un puntero C++ normal. Al igual que en C++, puede pasar .NET referencias "de referencia", pero en lugar de utilizar &, que utilice %, como en:

void makeStr(System::String^ %result) { 
    result = gcnew System::String("abc"); 
} 
+5

Sí, esta es la respuesta correcta. –

+0

¿Necesitamos explícitamente eliminar la variable "resultado" pasada desde la capa C# o el GC se encarga de eliminarla? – user1606191

Cuestiones relacionadas