Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Приведённый ниже код успешно компилируется: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Однако, я хочу объявление функции get_offset_point переместить в определение Arrow::Arrow, т.к. она используется только в этом конструкторе. Пишу так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Однако в результате получаю ошибку линковки: Errors Error 85 error LNK1120: 1 unresolved externals C:\bs\13\ch13\Debug\ch13.exe 1 1 ch13 Error 84 error LNK2019: unresolved external symbol "struct Point __cdecl get_offset_point(struct Point,double,double)" (?get_offset_point@@YA?AUPoint@@U1@NN@Z) referenced in function "public: __thiscall Bushman::Arrow::Arrow(struct Point,double,double,struct Bushman::Arrow_style)" (??0Arrow@Bushman@@QAE@UPoint@@NNUArrow_style@1@@Z) C:\bs\13\ch13\arrow.obj ch13 Почему линковщик не находит функцию во втором варианте? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 17:57 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
CompositumОднако, я хочу объявление функции get_offset_point переместить в определение Arrow::Arrow, т.к. она используется только в этом конструкторе.В С++ не бывает вложенных функций. Если хочешь ограничить видимость, вынеси конструктор в отдельный .cpp, положи рядом эту функцию и объяви ее static. А вообще, зачем тебе глобальная функция с ограниченной видимостью? То что ты хочешь обычно делают через приватные функции или приватные классы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:28 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
White OwlВ С++ не бывает вложенных функций. Это не вложеная функция, а вложенный прототип функции - второе разрешено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:35 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
Попробовал прописать полное имя, получил ещё более странные ошибки. Код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. Errors Error 33 error C2039: 'get_offset_point' : is not a member of 'Bushman' c:\bs\13\ch13\arrow.cpp 15 1 ch13 Error 34 error C2039: 'get_offset_point' : is not a member of 'Bushman' c:\bs\13\ch13\arrow.cpp 17 1 ch13 Error 35 error C2039: 'get_offset_point' : is not a member of 'Bushman' c:\bs\13\ch13\arrow.cpp 18 1 ch13 Error 36 error C2039: 'get_offset_point' : is not a member of 'Bushman' c:\bs\13\ch13\arrow.cpp 19 1 ch13 Странно, ведь функция находится именно в том пространстве имён, которое я указал... Вроде делаю по правилам: объявил, прежде чем использовал, причём сделал это даже в стиле C (разместил объявление в самом начале кода). авторВ С++ не бывает вложенных функций. Я в курсе. Кроме того, в моём коде их и нет. авторЕсли хочешь ограничить видимость, вынеси конструктор в отдельный .cpp, положи рядом эту функцию и объяви ее static. Я знаю об этом способе. Однако меня всё же интересует, почему на заработал способ, указанный мною. White OwlА вообще, зачем тебе глобальная функция с ограниченной видимостью? То что ты хочешь обычно делают через приватные функции или приватные классы. Функцию стоит делать приватной лишь в том случае, если для её работы необходим доступ к закрытым членам класса. В моём случае такой необходимости нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:37 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
CompositumФункцию стоит делать приватной лишь в том случае, если для её работы необходим доступ к закрытым членам класса. В моём случае такой необходимости нет. очепятка. Правильно так: CompositumФункцию стоит включать в состав интерфейса лишь в том случае, если для её работы необходим доступ к закрытым членам класса. В моём случае такой необходимости нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:39 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
CompositumСтранно, ведь функция находится именно в том пространстве имён, которое я указал... Нет. В лучшем случае она в Bushman::Arrow. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:45 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНет. В лучшем случае она в Bushman::Arrow. С какого перепугу? В интерфейс я её не включал: интерфейс Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:49 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
В принципе так можно. http://ideone.com/UaWCBh Compositum , у вас функция get_offset_point(): 1. не является членом класса 2. не объявлена как static 3. не объявлена как inline ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:52 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
не: static, inline, член классаВ принципе так можно. http://ideone.com/UaWCBh Compositum , у вас функция get_offset_point(): 1. не является членом класса 2. не объявлена как static 3. не объявлена как inline ? "да" по всем трём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 18:53 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
не: static, inline, член классаВ принципе так можно. http://ideone.com/UaWCBh Я показывал несколько иной вариант. То, что в функциях можно размещать объявления др. функций, я в курсе, т.к. сам это неоднократно делал ранее. Упрощённо, вот вариант, демонстрирующий обозначенную мною проблему кратко и наглядно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. Во время компиляции (MS VS 2012) получаю такой результат: LinkC:\bs\13>cl test.cpp /EHsc Microsoft (R) C/C++ Optimizing Compiler Version 17.00.51106.1 for x64 Copyright (C) Microsoft Corporation. All rights reserved. test.cpp Microsoft (R) Incremental Linker Version 11.00.51106.1 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj test.obj : error LNK2019: unresolved external symbol "void __cdecl func(void)" ( ?func@@YAXXZ) referenced in function "public: __cdecl Bushman::MyClass::MyClass( void)" (??0MyClass@Bushman@@QEAA@XZ) test.exe : fatal error LNK1120: 1 unresolved externals C:\bs\13> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 19:15 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
Сейчас проверил, в GCC 4.3.2/4.7.2 компилируется, в MSVS 2010/2012 ругается. Хз в чем затык, то ли по стандарту надо как-то по другому делать, то ли MSVS стандарт не держит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 19:45 |
|
||
|
Ошибка линковки при объявлении функции А в определении функции Б.
|
|||
|---|---|---|---|
|
#18+
По стандарту, если прототип объявлен внутри функции находящейся в неймспейсе, то у прототипа будет тот же неймспейс. А в вашем случае VS считает его глобальным. Т.е. это баг в VS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 19:59 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38302151&tid=2020136]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
181ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 10ms |
| total: | 272ms |

| 0 / 0 |
