Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
Уважаемые форумчане, небольшой вопрос по синтаксису для тех, кто в танке. Имеется шаблон класса, в котором объявлена функция SetValues. На этапе компиляции возникает ошибка линковки. Ошибка происходит уже при вызове функции объекта класса, созданного на основе шаблона. Текст ошибки следующий: "error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall test6_template<int>::SetValues(int,int)" (?SetValues@?$test6_template@H@@QAEXHH@Z) в функции "void __cdecl ReadItems(void)" (?ReadItems@@YAXXZ)c:\vs\ItemClassCore\ItemClassCore.obj" В чем может быть причина? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 17:06 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
pol_ar, Так как тела некоторых функций шаблона не видны в модулях где шаблон используется, то шаблон следует явно инстанцировать том модуле, где эти тела видны. Причем инстанцировать надо всеми потенциальными типами-параметрами шаблона. Код: plaintext 1. 2. 3. 4. 5. Альтернатива этому - помещать определения тел методов в заголовке, там же где описан класс. Но это не всегда удобно, т.к. увеличивается зависимость между модулями и время компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 17:54 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
То что Anatoly Moskovsky сказал и ещё: pol_arУважаемые форумчане, небольшой вопрос по синтаксису для тех, кто в танке. Имеется шаблон класса, в котором объявлена функция SetValues. На этапе компиляции возникает ошибка линковки. Ошибка происходит уже при вызове функции объекта класса, созданного на основе шаблона. Текст ошибки следующий: "error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall test6_template<int>::SetValues(int,int)" (?SetValues@?$test6_template@H@@QAEXHH@Z) в функции "void __cdecl ReadItems(void)" (?ReadItems@@YAXXZ)c:\vs\ItemClassCore\ItemClassCore.obj" В чем может быть причина? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. only constructors take member initializers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 18:27 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
забыл вычеркнуть :) name(a), counter(b) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 18:27 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
pol_ar, Извините, а почему вы при определении метода SetValues() используете синтаксис, который допустим только в конструкторах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 18:31 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
pol_ar, Уточню. Вот так можно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. А вот так нельзя: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 18:35 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskypol_ar, Так как тела некоторых функций шаблона не видны в модулях где шаблон используется, то шаблон следует явно инстанцировать том модуле, где эти тела видны. Причем инстанцировать надо всеми потенциальными типами-параметрами шаблона. Альтернатива этому - помещать определения тел методов в заголовке, там же где описан класс. Но это не всегда удобно, т.к. увеличивается зависимость между модулями и время компиляции. Разве? Инстанцировать (явно) методы надо не "всеми потенциальными типами-параметрами шаблона", а теми типами для которых это нужно... Например, для оптимизации или контроля что бы не для всех типов инстанцировалось. Мы можем "объявить инстанцирование в .h", а реализовать его в .cpp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 18:47 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
petravИнстанцировать (явно) методы надо не "всеми потенциальными типами-параметрами шаблона", а теми типами для которых это нужно... Например, для оптимизации или контроля что бы не для всех типов инстанцировалось. Мы можем "объявить инстанцирование в .h", а реализовать его в .cpp. Так как я написал выше - правильно. (Естественно инстанцировать надо не вообще всеми возможными типами, а именно потенциально используемыми с этим шаблоном) Вы не можете инстанцировать шаблон там, где нет реализации. Что такое "объявить инстанцирование" я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 18:59 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЧто такое "объявить инстанцирование" я не знаю. Имелось в виду в .h объявить конкретизированный вариант функции foo<int>(); -- просто объявление. А определение foo<int>(); оставить в отдельной единице компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 19:06 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
petravAnatoly MoskovskyЧто такое "объявить инстанцирование" я не знаю. Имелось в виду в .h объявить конкретизированный вариант функции foo<int>(); -- просто объявление. А определение foo<int>(); оставить в отдельной единице компиляции. Это вы путаете со специализацией. При специализации это возможно. Но бессмысленно, т.к. специализация сама по себе устраняет данную проблему (если она не частичная). А в данном топике обычный неспециализированный шаблон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 19:10 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
petravpol_ar, Извините, а почему вы при определении метода SetValues() используете синтаксис, который допустим только в конструкторах? Да, вы правы. При сокращении кода внес ошибку. Это и есть конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 10:55 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
Какое-то решение по этому вопросу мне удалось найти. Помог перенос определения конструктора в заголовочный файл, причем объявление и определение разнесены друг от друга, т.е. синтаксис все же был правильный. Если нет других версий, то будем считать это ошибкой компилятора Visual Studio 2010, который для обычных классов заглядывает в соответствующий *.cpp файл, чтобы найти тело (определение) метода, а для шаблонов "забывает" это сделать. Вот окончательный текст шаблона: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 12:48 |
|
||
|
Ошибка вызова функции из шаблона класса
|
|||
|---|---|---|---|
|
#18+
pol_arЕсли нет других версий, то будем считать это ошибкой компилятора Visual Studio 2010, который для обычных классов заглядывает в соответствующий *.cpp файл, чтобы найти тело (определение) метода, а для шаблонов "забывает" это сделать. это не ошибка компилятора, а поведение, регламентируемое стандартом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 13:06 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2020253]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
10ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 169ms |

| 0 / 0 |
