views:

85

answers:

4

Why doesn't Microsoft's C++/CLI allow me to pass strings by reference? I received the following error:

C3699: '&': cannot use this indirection on type 'System::String'

A: 

It looks like you are using Managed C++. You should use System::String^ instead.

leiz
+1 to counter downvote.
dalle
@dalle, Thanks :)
leiz
+4  A: 

Sounds like you are using Managed C++, which is a bastardised C++ used with the .NET Framework.

in Managed C++, I believe the syntax you are looking for is System::String^. The reason for this is that since managed types are garbage collected by .NET Framework, you aren't allowed to create 'regular' references since the GC needs to track all the references to a specific variable to know when it is safe to free it.

John Ledbetter
+1 for *bastardised*
karlphillip
i'm with karlphillip
dutt
Take a look at Microsoft's tutorial on Data Marshaling for an in-depth discussion on how memory is managed between native C/C++ and Managed C++. http://msdn.microsoft.com/en-us/library/ms384317(VS.71).aspx
jwadsack
A: 

In managed C++, you are always passing System::String by reference. It cannot be passed by value.

Michael Goldshteyn
+4  A: 

First of all, there are really two Microsoft-specific C++ dialects for .NET: the older "Managed C++" (Visual Studio 2002 and 2003) and C++/CLI (Visual Studio 2005, 2008 and 2010).

In C++/CLI, System::String^ is a .NET reference to a string; some authors call this a "tracking pointer" to compare and contrast it with a normal C++ pointer. As in C++, you can pass .NET references "by reference", but instead of using &, you use %, as in:

void makeStr(System::String^ %result) {
   result = gcnew System::String("abc");
}
Dan
Yes, this is the correct answer.
Hans Passant