Ваша основная проблема в том, что ваша функция specificSearch
присваивает объекту int
. Но то, что вы хотите написать, это unsigned int
объект. К счастью, строгие правила псевдонимов позволяют нам писать в unsigned int
, как если бы это было int
. Система типов не совсем поощряет это, но ее можно убедить:
searchState.matchedOK = specificSearch(*reinterpret_cast<int*>(pageIndices.GetStringIByRef()), searchState);
Этот тип полагается на записываемое значение в общем диапазоне двух типов (от 0 до INT_MAX
). Я говорю «что-то вроде», потому что в системах дополнения 2 результат записи значения вне этого диапазона совпадает с результатом преобразования значения в unsigned int
. В системах, не дополняющих 2, которые на практике не существуют, но в принципе мешают нашим попыткам создания переносимого кода, результат будет другим и, следовательно, вероятно неправильным.
Было бы лучше, если возможно, определить перегрузку specificSearch
:
static bool specificSearch(unsigned int &matchLocation, const SearchSpecs &specs) {
int loc;
bool retval = specificSearch(loc, specs);
if (retval) { // I'm guessing here about the meaning of the return value
matchLocation = loc; // converts int to unsigned int
}
return retval;
}
Предполагается, что функция-обертка может определить, является ли "реальный" specificSearch
назначенным loc
или нет, так что она знает, назначать или нет matchLocation
. Если вызывающая функция не может каким-то образом выяснить это, это не сработает (и если specificSearch
разрешено назначать, а затем выдавать исключение, вам также необходимо учитывать это).
Было бы разумнее, если возможно, изменить stringI
на правильный тип.