C++/CLI -- address of operator

Consider this code in Managed Extensions for C++ (.Net 1.1)

int MyInt;


That calls MyFunction with the address of MyInt, because MyFunction wants an int*.

Now, in .Net 2+, MyFunction wants an int^.

So ... how do I call it?  If I say
I am told Error C3071: % can only be applied to an instance of a ref class or a value type.

I would have thought that int was a value type.

So again, how do I call MyFunction?

LVL 32
Daniel WilsonAsked:
Who is Participating?
jkrConnect With a Mentor Commented:
Did you mean



'%' is the modulus operator.
Daniel WilsonAuthor Commented:
yes, % is modulus.

And in real C++, it has no other meaning, to my knowledge.

But in C++/CLI it is similar to &.  See the "tracking reference" section here:
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

mrjoltcolaConnect With a Mentor Commented:
I think you need:

I think what the function wants is a handle to an Int32^. I may be wrong, but the following demonstration should be along the lines you're looking for:
System::Int32 someInt;

Open in new window

Daniel WilsonAuthor Commented:
does not compile.  In addition to C3071, I get:
C2100: Illegal indirection
C3192: Syntax Error: '^' is not a prefix operator. (Did you mean '*' ?)
Daniel WilsonAuthor Commented:
System::Int32 someInt;

This doesn't compile either.  I still get C3071.

Thanks to both of you for your ideas.  Do you have more I can try?

Daniel WilsonAuthor Commented:
Another overload out there for MyFunction is
static void MyFunction(System::IntPtr x);

I do find that the call MyFunction(MyInt); compiles.  Will I be sorry if I go with this?
tcullerConnect With a Mentor Commented:
Well, have you tried just using the address-of operator? It may actually be looking for a pointer to a native int.

System::IntPtr would be ok; it's just a wrapper for a pointer to an int. That structure is usually used for things like managed handles. The .NET Framework rather dislikes pointers, so they created a special wrapper just for that reason. For example, in C#, to even work with pointers at all, you must compile with a /unsafe switch, on top of having the pointer-utilizing code within a block marked as unsafe.

Anyways, that call should work just fine. If the overload requests it and it compiles, I see no reason it should be the wrong thing.

By the way, int and Int32 are very different in C++, but yes, they are value types. I'm not sure why it doesn't let you use the % operator on it; that error message is incorrect in assuming int is not a value type.
Daniel WilsonAuthor Commented:
>>Well, have you tried just using the address-of operator?

& ?  Yes, I started there.  But I get C2665: 'MyFunction': none of the X overloads could convert all the argument types

Of course, MyFunction is not really mine.  I'm working against the Tao Framework which is written in C#.

One of the functions is this one, the 2nd parameter being my problem one:
        public static extern int ChoosePixelFormat(IntPtr deviceContext, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor);

Another is this, again the 2nd parameter being the one in question.        
        public static
        void glGenTextures(Int32 n, [Out] IntPtr textures)
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.