У меня есть код, написанный кем-то еще, в котором некоторые функции принимают аргументы, типы данных которых сопровождаются * &. Я привык к функциям, принимающим одну или другую, например, принимая "двойной *" или "двойной &", но не оба. Казалось бы, они просто отменили.
Вот пример, и все это из их кода, который предположительно работает:
В заголовочном файле есть функция, объявленная как:
void someClass::foo(const unsigned int*& ubuff);
Затем в моем главном файле есть указатель на некоторые UINT, объявленные и инициализированные как:
unsigned int* pbuff = new UINT[n];
Тогда функция someClass :: foo называется:
foo(pbuff);
Когда я компилирую, я получаю сообщение об ошибке «не могу преобразовать параметр 1 из« unsigned int * »в« const unsigned int * & »». Если я изменю свой вызов функции на следующий, он скомпилируется нормально:
foo((const unsigned int *&)(pbuff));
Итак, мои вопросы:
Какова цель * &? То есть, как это отличается от * или & сами по себе, и почему они не просто исключают себя? И что это заставляет функцию foo ожидать? Адрес? Ценность? Адрес адрес? Это сбивает с толку.
Исправлено ли просто приведение "unsigned int *" к "const unsigned int * &" ok или мне нужно сделать что-то еще?
Еще один быстрый пример, и он полностью из файла cpp, распространяемого кем-то другим, поэтому я предполагаю, что это скомпилировано для них. У них есть вызов функции как
klabels = new int[sz];
EnforceLabelConnectivity(klabels, m_width, m_height, nlabels, numlabels, double(sz)/double(STEP*STEP));
Когда я пытаюсь собрать, я получаю сообщение об ошибке "SLIC :: EnforceLabelConnectivity": не могу преобразовать параметр 1 из 'int *' в 'const int * &' ".
Спасибо как всегда.