2010-10-14 6 views
6

Perché il C++/CLI di Microsoft non consente il passaggio di stringhe per riferimento? Ho ricevuto il seguente errore:C++/CLI: Perché non riesco a passare le stringhe per riferimento?

C3699: '&': non è possibile utilizzare questo riferimento indiretto del tipo 'System :: String'

+1

ho aggiunto il C++ - tag cli perché sembra che questo è ciò che sei usando qui. – configurator

+0

Proprio come un punto di riferimento: C++/CLI è * not * C++; nonostante la somiglianza tra i nomi, i tag C++ e C++ - cli sono piuttosto vicini a mutuamente esclusivi; le domande su una (inclusa questa) spesso non hanno senso per quanto riguarda l'altra. –

risposta

11

Suoni come se si stesse usando Gestito C++, che è un C++ bastardizzato utilizzato con .NET Framework.

in Managed C++, credo che la sintassi che stai cercando sia System::String^. La ragione di ciò è che poiché i tipi gestiti sono garbage collection raccolti da .NET Framework, non è consentito creare riferimenti "regolari" poiché il GC deve tracciare tutti i riferimenti a una variabile specifica per sapere quando è sicuro liberarlo .

+10

+1 per * bastardised * – karlphillip

+1

sono con karlphillip – dutt

+0

Dai un'occhiata al tutorial di Microsoft su Data Marshaling per una discussione approfondita su come viene gestita la memoria tra C/C++ nativo e C++ gestito. http://msdn.microsoft.com/en-us/library/ms384317(VS.71).aspx – jwadsack

0

Sembra che si sta utilizzando Managed C++. Dovresti usare System :: String ^.

+0

+1 per contrastare downvote. – dalle

+0

@dalle, Grazie :) – leiz

26

Prima di tutto, esistono due dialetti C++ specifici per Microsoft per .NET: il vecchio "Managed C++" (Visual Studio 2002 e 2003) e C++/CLI (Visual Studio 2005 e versioni successive).

In C++/CLI, System::String^ è un riferimento .NET a una stringa; alcuni autori chiamano questo "puntatore di tracciamento" per confrontarlo e contrastarlo con un normale puntatore C++. Come in C++, è possibile passare .NET riferimenti "di riferimento", ma invece di usare &, è usare %, come in:

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

Sì, questa è la risposta corretta. –

+0

Abbiamo esplicitamente bisogno di eliminare la variabile "risultato" passata dal livello C# o il GC si occupa di eliminarlo? – user1606191

Problemi correlati