В C++, почему компилятор выбирает функцию неконстанты, когда константа работала бы также? [дубликат]

Похоже, что вы отсутствуете, включая IOBluetooth.framework в своем проекте. Вы можете добавить его по:

-Нажмите на свой проект в левом верхнем углу левой панели (синий значок).

. На средней панели щелкните вкладку «Фазы построения».

-Включить «Связывание двоичных файлов с библиотеками», нажмите кнопку «плюс».

-Закройте IOBluetooth.framework из списка и нажмите Добавить.

enter image description here [/g0]

enter image description here [/g1]

Это позволит убедиться, что определения IOBluetooth.framework найдены компоновщиком , Вы можете видеть, что фреймворк является членом вашей цели, щелкнув фреймворк в левой панели и увидев целевое членство структуры в правой панели (обратите внимание, что я переместил структуру в группе Frameworks для целей организации):

enter image description here [/g2]

18
задан 2 revs, 2 users 100% 7 September 2012 в 20:12
поделиться

4 ответа

Два ответа приходят на ум:

  1. версия неконстанты является более близким соответствием.

  2. , Если это назвало перегрузку константы для случая неконстанты, затем при каких обстоятельствах был бы, это когда-нибудь называет перегрузку неконстанты?

можно заставить это использовать другую перегрузку путем кастинга a к const Foo *.

Редактирование: От Аннотации C++

Ранее, в разделе 2.5.11 понятие перегрузки функции было представлено. Там это отметило, что функции членства могут быть перегружены просто их атрибутом константы. В тех случаях компилятор будет использовать функцию членства , соответствующую наиболее тесно квалификации константы объекта:

16
ответ дан 30 November 2019 в 07:09
поделиться

Поскольку не указатель константы. Поэтому функция неконстанты является более близким соответствием. Вот то, как можно вызвать функцию константы:

const Foo* b = a;
std::string name = b->Name();

, Если Вы имеете и константу и перегрузку неконстанты, и хотите назвать константу один на объекте неконстанты, это могло бы быть признаком плохого дизайна.

18
ответ дан 30 November 2019 в 07:09
поделиться

Компилятор не принимает во внимание, как Вы используете возвращаемое значение в его определении; это не часть правил. Это не знает, делаете ли Вы

std::string name = b->Name();

, или

b->Name() = "me";

Это должно выбрать версию, которая работает в обоих случаях.

6
ответ дан 30 November 2019 в 07:09
поделиться

Можно добавить функцию "cName", которая эквивалентна "Имени () константа". Таким образом, можно звонить, версия константы функции, не бросая к константе возражают сначала.

Это главным образом полезно с новым ключевым словом, автоматическим в C++ 0x, который является, почему они обновляют библиотеку для включения cbegin (), cend (), crbegin (), crend () для возврата const_iterator, даже если объект является неконстантой

, Что Вы делаете, вероятно, лучше сделан при наличии setName () функция, которая позволяет Вам менять имя вместо того, чтобы возвратить ссылку на базовый контейнер, и затем "возможно", это изменяется.

0
ответ дан 30 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: