2010-10-14 11 views
6

Warum erlaubt mir Microsoft C++/CLI nicht, Strings per Referenz zu übergeben? Ich erhielt den folgenden Fehler:C++/CLI: Warum kann ich Strings nicht als Referenz übergeben?

C3699: '&': kann nicht diese Indirektion auf Typ 'System :: String' verwenden

+1

ich hinzugefügt, um die C++ - cli-Tag, weil es so aussieht, was du bist hier benutzen. – configurator

+0

Nur als Bezugspunkt: C++/CLI ist * nicht * C++; Trotz der Namensähnlichkeit schließen sich C++ - und C++ - cli-Tags gegenseitig aus; Fragen über eine (einschließlich dieser) machen oft keinen Sinn in Bezug auf die andere. –

Antwort

11

Sounds wie Sie verwenden Managed C++, die ein Bastard C++ mit dem .NET Framework verwendet wird.

in Managed C++, ich glaube, die Syntax, die Sie suchen, ist System::String^. Der Grund dafür ist, dass verwaltete Typen von .NET Framework nicht erfasst werden. Daher ist es nicht zulässig, "normale" Referenzen zu erstellen, da der GC alle Verweise auf eine bestimmte Variable verfolgen muss, um sicher zu sein, dass sie freigegeben werden .

+10

+1 für * bastardised * – karlphillip

+1

Ich bin mit karlphillip – dutt

+0

Werfen Sie einen Blick auf Microsofts Tutorial zu Data Marshalling für eine eingehende Diskussion darüber, wie Speicher zwischen nativem C/C++ und verwaltetem C++ verwaltet wird. http://msdn.microsoft.com/en-us/library/ms384317(VS.71).aspx – jwadsack

0

Es sieht aus wie Sie C Managed ++ verwenden. Sie sollten stattdessen System :: String^verwenden.

+0

+1, um zu widersprechen. – dalle

+0

@dalle, Danke :) – leiz

26

Zunächst gibt es wirklich zwei Microsoft-spezifische C++ - Dialekte für .NET: die älteren "Managed C++" (Visual Studio 2002 und 2003) und C++/CLI (Visual Studio 2005 und höher).

In C++/CLI ist System::String^ eine .NET-Referenz auf eine Zeichenfolge; Einige Autoren nennen dies einen "Tracking-Zeiger", um ihn mit einem normalen C++ - Zeiger zu vergleichen und gegenüberzustellen. Wie in C++ können Sie .NET Referenzen "by reference", übergeben, sondern & zu verwenden, verwenden Sie %, wie in:

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

Ja, das ist die richtige Antwort. –

+0

Müssen wir explizit die Variable "result" löschen, die von C# Layer übergeben wurde, oder kümmert sich der GC darum, sie zu löschen? – user1606191

Verwandte Themen