8

I'm trying to write an application in Managed C++, but I cannot work out how to declare an array of strings.

String^ linet[];

throws an error

'System::String ^' : a native array cannot contain this managed type

So I suppose there's a different way to do this for managed data types. What exactly is it?

1
  • Just a little nitpick: While Managed C++ & C++/CLI will to my knowledge be compiled into the same code, they're actually two distinct languages. Commented Jun 14, 2016 at 21:38

3 Answers 3

11

Do you really mean Managed C++? Not C++/CLI?

Assuming you're actually using C++/CLI (because of the error message you posted), there are two ways to do this:

array<String^>^ managedArray = gcnew array<String^>(10);

will create a managed array, i.e. the same type as string[] in C#.

gcroot<String^>[] unmanagedArray;

will create an unmanaged C++ array (I've never actually tried this with arrays - it works well with stl containers, so it should work here, too).

Sign up to request clarification or add additional context in comments.

2 Comments

How's that work when calling String->Split() (array of strings version)?
@user645280 - array<String^>^ sa = str->Split(gcnew array<String^>{"one","two"}, StringSplitOptions::None); You need to specify the StringSplitOptions when using spit strings.
4

http://www.codeproject.com/KB/mcpp/cppcliarrays.aspx

That should have all the answers you need :)

When working with Managed C++ (aka. C++/CLI aka. C++/CLR) you need to consider your variable types in everything you do. Any "managed" type (basically, everything that derives from System::Object) can only be used in a managed context. A standard C++ array basically creates a fixed-size memory-block on the heap, with sizeof(type) x NumberOfItems bytes, and then iterates through this. A managed type can not be guarenteed to stay the same place on the heap as it originally was, which is why you can't do that :)

3 Comments

Just a little nitpick: While Managed C++ & C++/CLI will to my knowledge be compiled into the same code, they're actually two distinct languages.
From en.wikipedia.org/wiki/Managed_Extensions_for_C%2B%2B "...These new extensions were designated C++/CLI and included in Microsoft Visual Studio 2005.[1] The term Managed C++ and the extensions it refers to are thus deprecated and superseded by the new extensions...." - So yeah, you are absolutely correct.
I only mentioned it because Managed C++ doesn't use handles (managed pointers, declared as type^), but C++/CLI does. ...Now that I think about it, the person who asked the question got the two mixed up, too.
1

You use a collection class from .Net. For example:

List<String^>^ dinosaurs = gcnew List<String^>();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.