почему это не компилируется при использовании std :: max и c ++ / CLI? - PullRequest
3 голосов
/ 21 октября 2010

Может кто-нибудь объяснить, почему следующее будет компилировать

int a = aAssignments[i]->Count;
int b = fInstanceData->NumRequiredEmpsPerJob[i];
fInstanceData->NumSlotsPerJob[i] = max(a,b);

, но

fInstanceData->NumSlotsPerJob[i] = max((int)(aAssignments[i]->Count), (int)(fInstanceData->NumRequiredEmpsPerJob[i])); //why on earth does this not work?

не так?Это ошибка: error C2665: 'std::max' : none of the 7 overloads could convert all the argument types

Переменная aAssigmments имеет тип array<List<int>^>^, а fInstanceData->NumRequiredEmpsPerJob имеет тип array<int>^

В руководстве по std::max указано, что онапринимает значения по ссылке, поэтому он явно делает это неявно в первом примере, так почему же компилятор не может сделать то же самое для целочисленных значений, возвращаемых свойством count, как во втором примере?Могу ли я получить ссылку на int явно?

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

(int)(aAssignments[i]->Count) позвонит получателю имущества.Но он оценивается как временная переменная (rvalue), которая не может связываться с неконстантной ссылкой.

Согласно моей документации на std::max, параметры должны быть константными ссылками, и все должно работать.

Что произойдет, если вы явно укажете параметр типа шаблона, например,

max<int>((int)(aAssignments[i]->Count), (int)(fInstanceData->NumRequiredEmpsPerJob[i]))

?

Как насчет max<int>(a + 0, b + 0)?

1 голос
/ 21 октября 2010

List <>. Count не поле, это свойство.Вы не можете создать неуправляемую ссылку на управляемое свойство, получение значения свойства требует вызова метода доступа к свойству.Если не считать вашего первого подхода, лучшая мышеловка здесь - использовать Math :: Max ().

...