Тип аргумента функции, за которым следует * & - PullRequest
1 голос
/ 20 февраля 2011

У меня есть код, написанный кем-то еще, в котором некоторые функции принимают аргументы, типы данных которых сопровождаются * &. Я привык к функциям, принимающим одну или другую, например, принимая "двойной *" или "двойной &", но не оба. Казалось бы, они просто отменили.

Вот пример, и все это из их кода, который предположительно работает:

В заголовочном файле есть функция, объявленная как:

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));

Итак, мои вопросы:

  1. Какова цель * &? То есть, как это отличается от * или & сами по себе, и почему они не просто исключают себя? И что это заставляет функцию foo ожидать? Адрес? Ценность? Адрес адрес? Это сбивает с толку.

  2. Исправлено ли просто приведение "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 * &' ".

Спасибо как всегда.

Ответы [ 3 ]

3 голосов
/ 20 февраля 2011

Для типа T T *& означает «ссылку на указатель на T». Вызывающая функция должна передать указатель на T. Что касается модификатора const, попробуйте foo((const unsigned int *)pBuff);, иначе объявите pBuff как указатель на const int для начала.

1 голос
/ 21 февраля 2011

Ну, я попытался привести к (const unsigned int *), и это не сработало (не будет строить). В конце мне пришлось полностью привести к (const unsigned int * &) в примере функции foo в моем исходном посте. Надеюсь это поможет. Благодарю.

Кроме того, причина, по которой я не пошел по пути создания pbuff const с самого начала в своем основном коде, заключается в том, что он передается другой функции, которая впоследствии модифицирует ее, поэтому я не думаю, что она будет работать чтобы сделать это const, когда объявлено.

0 голосов
/ 20 февраля 2011
  1. Указатели и ссылки действительно разные, но использование ссылки на указатель бесполезно.
  2. Это не нормально, pbuff не const, поэтому ваш код не компилируется. Используйте const pbuff или поменяйте свой прототип, разыграв его так ужасно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...