Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
Qt Creator 4.2.1 h- файл: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. cpp- файл: Код: plaintext 1. 2. 3. 4. 5. 6. 7. В main на строчке получаю ошибку: Код: plaintext 1. /home/work/.qt/Reseaches/CompareFiles/CompareFiles.cpp:30: ошибка: undefined reference to `MyLib::task_manager<QString>::task_manager()' Почему??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 14:48 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
В h и cpp -файлы добавил: Код: plaintext 1. Не помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 14:51 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
Причем если реализовать класс без шаблона, то все отлично работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 14:52 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQLПочему??? Потому что у тебя действительно нет реализации шаблона для типа QString. Собственно, её вообще нет ни для какого типа. Если не хочешь реализацию делать прямо в заголовке, пиши так: Код: sql 1. 2. 3. 4. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 15:29 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQLnamespace MyLib { template <class Type> class task_manager : public QThreadPool { ... Почему??? Реализации шаблонных классов и функций должны быть доступны в виде определений соотв. функций и данных во всех местах, где производится их инстанциирование. На практике это означает почти всегда, что весь код шаблонов должен быть доступен в заголовке с шаблоном, и код быть объявлен как inline (возможно, неявно). Т.е. Шаблоны ДОЛЖНЫ БЫТЬ ВСЕ В ЗАГОЛОВОЧНЫХ ФАЙЛАХ , и включаться во все исходные модули (если конечно шаблон не используется только в одном модуле). Кроме включения исходного кода, в С++ пока нет другого способа разделять определения шаблонов между исходными модулями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 15:50 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQLВ h и cpp -файлы добавил: Код: plaintext 1. Не помогло. ЭТо нужно добавить только в исходный модуль, где ты инстанциируешь шаблон с QString. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 15:52 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
MasterZivШаблоны ДОЛЖНЫ БЫТЬ ВСЕ В ЗАГОЛОВОЧНЫХ ФАЙЛАХ , и включаться во все исходные модули (если конечно шаблон не используется только в одном модуле). Кроме включения исходного кода, в С++ пока нет другого способа разделять определения шаблонов между исходными модулями. Спасибо! Перетащил все из cpp- файла шаблона в h- файл шаблона и все взлетело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 16:23 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
Теперь проблема в другом месте :) Класс содержит либо массив строк, либо массив структур, в которых лежит строка: Код: plaintext 1. Поэтому при вызове функции, которая принимает строку появляется ошибка: Код: plaintext 1. 2. 3. 4. 5. Попытался написать так: Код: plaintext 1. 2. Тоже получил ошибку: Код: plaintext Попробовал сделать явную перегрузку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Получил ошибку: Код: plaintext Как выкрутиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:39 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
Ошибся при копипасте. Последний код правильно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 18:13 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQLТеперь проблема в другом месте :) Класс содержит либо массив строк, либо массив структур, в которых лежит строка: Поэтому при вызове функции, которая принимает строку появляется ошибка: Как выкрутиться? На сколько я понял, будет достаточно у этого класса/структуры определить оператор преобразования к типу строки, которая тебе нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 19:10 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
MasterZivНа сколько я понял, будет достаточно у этого класса/структуры определить оператор преобразования к типу строки, которая тебе нужна. Спасибо, за помощь. Да, именно это и нужно. Но все те же ошибки тогда вылезут при реализации этого чудесного оператора. Надо каким-то образом при различных типах данных выполнить различный код: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 19:39 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQL Код: plaintext 1. 2. Эт Вам в Python/PyQt, батенька, надо идти. Тут ты либо пишешь специализации для каждого типа, либо используешь if constexpr , если он у тебя доступен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 19:50 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
NekZЭт Вам в Python/PyQt, батенька, надо идти. Тут ты либо пишешь специализации для каждого типа, либо используешь if constexpr , если он у тебя доступен. Так и специализацию пробовал делать (если я правильно понимаю этот термин): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 20:02 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
Опять ошибся при копипасте :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 20:04 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
Всем спасибо! Заработало при использовании ключевого слова inline в определении специализированного и шаблонного метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 10:43 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Можно через template instantiation. Шаблонный класс будет доступен тогда только для определенных типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 16:51 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
ermak.nnMasterZiv, Можно через template instantiation. Шаблонный класс будет доступен тогда только для определенных типов. Можно то оно можно, только ЧТО? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 16:39 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
MasterZiv, забыл вставить цитату. Я про это говорил. MasterZivAlekseySQLnamespace MyLib { template <class Type> class task_manager : public QThreadPool { ... Почему??? Шаблоны ДОЛЖНЫ БЫТЬ ВСЕ В ЗАГОЛОВОЧНЫХ ФАЙЛАХ , и включаться во все исходные модули (если конечно шаблон не используется только в одном модуле). Кроме включения исходного кода, в С++ пока нет другого способа разделять определения шаблонов между исходными модулями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2017, 19:24 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
MasterZivШаблоны ДОЛЖНЫ БЫТЬ ВСЕ В ЗАГОЛОВОЧНЫХ ФАЙЛАХ , и включаться во все исходные модули (если конечно шаблон не используется только в одном модуле). Кроме включения исходного кода, в С++ пока нет другого способа разделять определения шаблонов между исходными модулями. Тут в первом ответе предлагается способ написать определение шаблонного метода в cpp- файле. Мне нравится этот подход, поскольку h-файл уменьшается и с ним можно работать как с интерфейсом (не лазия по огромному файлу в поисках нужной функции). Какие подводные камни у этого подхода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2018, 09:09 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQL Тут в первом ответе предлагается способ написать определение шаблонного метода в cpp- файле. Мне нравится этот подход, поскольку h-файл уменьшается и с ним можно работать как с интерфейсом (не лазия по огромному файлу в поисках нужной функции). Какие подводные камни у этого подхода? Балин, тут реализация должна быть в месте использования... Не подходит этот метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2018, 09:33 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
Есть какие- то хитрые способы, чтобы все- таки реализацию методов шаблонного класса вытащить в cpp- файл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2018, 10:06 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЕсть какие- то хитрые способы, чтобы все- таки реализацию методов шаблонного класса вытащить в cpp- файл? Есть - явное инстанцирование шаблона в том .cpp где тело шаблона. Это делается для каждого типа с которым шаблон используется. (Линкер подскажет ) Читайте про explicit instatiation http://en.cppreference.com/w/cpp/language/class_template#Explicit_instantiation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2018, 11:05 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЕсть какие- то хитрые способы, чтобы все- таки реализацию методов шаблонного класса вытащить в cpp- файл? Ты их можешь поместить в .cpp, но только если эти шаблоны будут использоваться только в этом CPP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2018, 14:41 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЕсть какие- то хитрые способы, чтобы все- таки реализацию методов шаблонного класса вытащить в cpp- файл?1. Исключить этот cpp-файл из сборки 2. Добавить #include "a.cpp" в хвост a.h ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 05:13 |
|
||
|
Не видит реализации класса
|
|||
|---|---|---|---|
|
#18+
CEMbAlekseySQLЕсть какие- то хитрые способы, чтобы все- таки реализацию методов шаблонного класса вытащить в cpp- файл?1. Исключить этот cpp-файл из сборки 2. Добавить #include "a.cpp" в хвост a.h Ойойой... Тогда надо уже и переименовать его в *.inl ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 13:22 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39453898&tid=2017873]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 163ms |

| 0 / 0 |
