types – why doesn’t this compile when using std::max and c++/CLI? – Education Career Blog

Can anyone please explain why the following will compile

int a = aAssignmentsi->Count;
int b = fInstanceData->NumRequiredEmpsPerJobi;
fInstanceData->NumSlotsPerJobi = max(a,b);

but

fInstanceData->NumSlotsPerJobi = max((int)(aAssignmentsi->Count), (int)(fInstanceData->NumRequiredEmpsPerJobi)); //why on earth does this not work?

wont? The error it gives is error C2665: 'std::max' : none of the 7 overloads could convert all the argument types

The variable aAssigmments is of type array<List<int>^>^ and fInstanceData->NumRequiredEmpsPerJob is of type array<int>^

The manual for std::max states that it takes values by reference, so it’s clearly doing this implicitly in the first example, so why can’t the compiler do the same for integer values returned by the count property, as in the second example? Can I get a reference to an int explicitly?

,

(int)(aAssignmentsi->Count) will call the property getter. But it evaluates to a temporary variable (rvalue) which cannot bind to a non-const reference.

According to my documentation on std::max, the parameters should be const references and everything should work.

What happens if you explicitly specify the template type parameter, e.g.

max<int>((int)(aAssignmentsi->Count), (int)(fInstanceData->NumRequiredEmpsPerJobi))

?

What about max<int>(a + 0, b + 0) ?

,

List<>.Count is not a field, it is a property. You can’t create a unmanaged reference to a managed property, obtaining the property value requires calling the property accessor. Short from your first approach, the better mousetrap here is to use Math::Max().

Leave a Comment