|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|||||||||||
Приватная переменная недоступна в шаблонном методе реализованном в .h файле15.09.2020, 20:47. Показов 2609. Ответов 36
Добрый вечер,
Есть класс SeisContainer. Этот класс имеет приватную переменную File h5File (File это тип из библиотеки с работой HDF5 форматом данных). Класс SeisContainer имеет метод createSeis(...). Если реализацию этого метода помещаю в файл .срр то никаких проблем не возникает и все работает, но мне необходимо объявить этот метод как шаблон и соответственно реализацию я помещаю в заголовочный файл. Тогда я получаю ошибку связанную с тем, что File h5File не может создать группу (Group). Помогите пожалуйста разобраться, где я косячу когда использую шаблон?
0
|
|||||||||||
| 15.09.2020, 20:47 | |
|
Ответы с готовыми решениями:
36
Узнать размер типа-параметра в шаблонном методе Переменная, содержащая тип, в шаблонном классе |
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||
| 15.09.2020, 23:55 | ||||||
|
Сделай пока, чтоб всегда новый создавался
1
|
||||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||||
| 16.09.2020, 04:08 [ТС] | ||||
|
oleg-m1973,
Я убрал using namespace HighFive ошибка не ушла. Добавлено через 56 минут oleg-m1973, оставил реализацию в хедере, убрал темплайт и все равно не работает. При этом если реализацию сделать в .срр и убрать темплейт то работает. Вероятно это никак не связано с темлэйтом, но связано с реализацией в хедере Добавлено через 2 часа 36 минут oleg-m1973, я не понимаю почему, но h5File в хедере не работает только с существующим файлом, то есть с тем файлом, который был создан в экземпляре класса SeisContainer. При этом, даже если в хедере h5File присвоить другой уже существующий HDF5 файл (с жесткого диска), то h5File окажется работоспособным. Опять же, в .срр файле никаких проблем с переменной h5File нет... Добавлено через 15 минут oleg-m1973,
0
|
||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 16.09.2020, 11:53 | |||||||
|
Сделай реализацию своего метода прямо внутри класса, и проверь с шаблонами и без
1
|
|||||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||
| 16.09.2020, 16:49 [ТС] | ||
|
oleg-m1973,
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 16.09.2020, 16:57 | ||
|
Мне, к сожалению, сложно тебе тут что-то подсказать, т.к. я понятия не имею что это такое
1
|
||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|||||||||||
| 17.09.2020, 18:23 [ТС] | |||||||||||
|
oleg-m1973, я прошу прощения снова обращаюсь к вам.
Я заметил, что все указанные проблемы существуют только когда я SeisContainer помещаю в динамическую библиотеку. Например, если упростить класс SeisContainer до одного конструктора: seiscontainer.h
Кроме того, без .срр файла и с COREDLL_EXPORT я получаю ошибки на этапе линковки: main.obj:-1: ошибка: LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl SeisContainer::SeisContainer(class HighFive::File)" (__imp_??0SeisContainer@@QEAA@VFile@High Five@@@Z) referenced in function main main.obj:-1: ошибка: LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl SeisContainer::~SeisContainer(void)" (__imp_??1SeisContainer@@QEAA@XZ) referenced in function main debug\app.exe:-1: ошибка: LNK1120: 2 unresolved externals Поэтому я добавляю пустой .срр файл Таким образом, проблемы берутся оттого, что я включаю класс в динамическую библитеку и реализую методы класса в хэдэр файле. Может у вас появились новые мысли? Мне не хватает знаний чтобы понять почему так происходит Работаю в Qt 5.14.2, Windows 10 x64, компилятор MSVC 2017
0
|
|||||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 17.09.2020, 18:29 | ||
Сообщение было отмечено Kerim_Geophysic как решение
РешениеКлассы вообще лучше не использовать в экспорте dll. А шаблонные - тупо нельзя. Тут надо использовать абстактный интерфейс с виртуальными функциями.
1
|
||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||
| 17.09.2020, 18:38 [ТС] | ||
![]() Это касается только динамической библиотеки или статической тоже? Можно ссылку где можно про эти нюансы почитать?
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 17.09.2020, 18:53 | |||
|
Добавлено через 3 минуты
1
|
|||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 17.09.2020, 19:02 [ТС] | |
|
oleg-m1973, понял, спасибо буду знать!
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 18.09.2020, 10:18 | ||
|
Kerim_Geophysic, в рамках одного компилятора Visual Studio (т.е.е если ваши DLL и Приложение созданы одним компилятором) вы можете делать экспорт класса из DLL, но у этих классов не нужно делать inline методы. Это может привести к нарушению ODR.
Шаблоны классов - это вообще не классы, а лишь трафарет для них, поэтому их физически нельзя разместить внутри DLL. Ошибки вы получаете потому, что экспорт класса приводит к экспорту всех его функций, но чтобы экспортировать их, они должны быть физически размещены в модуле. inline-функции физически не существуют, если их никто не вызывает (а этого у вас не происходит на стороне модуля DLL), поэтому в результате вы оставили вашу DLL без определений этих функций.
1
|
||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|||
| 18.09.2020, 17:31 [ТС] | |||
|
"Негативная" уникальность шаблонов (шаблонные методы/классы) в моем понимании заключается в том, что они должны быть определены в заголовочном файле. Соответственно возникают следующие трудности: если шаблонный метод требует внешних включений (требует #inline ...), то эти директивы придется включать в этот заголовочный файл (а не в файл реализации как это рекомендуется). Тогда в последующем, когда этот хэдэр с шаблонными методами надо будет включить в другой класс (в другой файл .h/.срр, вероятно это можно назвать "модуль"), то этот хэдэр потащит за собой и все уже включенные в него инклюды. Помимо неудобств, это вроде бы может также приводить к каким-то конфликтам, которые сложно обнаружить и разрешить (пару месяцев назад вроде бы встречался с такой проблемой, что исходный код на этапе сборки стал выдавать ошибку) Не совсем понимаю сложности с inline методами. Загуглил тут:https://ru.wikipedia.org/wiki/... 0%B8%D1%8F inline могут работать быстрее, но если рассматривать сборку как препроцессинг, компиляция и линковка, то мне не понятно на каком этапе эти встроенные функции собираются не так как обычные методы. С шаблонами также?
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 18.09.2020, 17:46 | ||
|
1
|
||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 18.09.2020, 18:04 [ТС] | |
|
oleg-m1973, вопрос:
обычно для подключения DLL мы включаем необходимые заголовки и подключаем саму библиотеку DLL. Если какая то функция DLL определена в заголовке, то будет ли эта функция включена в DLL? И если да, то наше приложение, использующее DLL, при включении этого заголовка откуда будет брать определение этой функции: из DLL или из хэдэра?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 18.09.2020, 18:08 | ||
|
Добавлено через 2 минуты Из длл ты можешь получить только указатель на функцию, т.е. какой-то адрес. Как его интерпретировать решается уже в exe, ты сам решаешь, грубо говоря вручную
1
|
||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 18.09.2020, 18:26 [ТС] | |
|
oleg-m1973, спасибо большое за разъяснение
немного въехал
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 18.09.2020, 20:45 | ||||
|
А вот если вы вызовете эту функцию внутри DLL, то тело ее может быть создано, а может и не быть создано - это вот как раз зависит от компилятора.
1
|
||||
| 18.09.2020, 20:45 | |
|
Классы, переменная в методе
Не изменяется глобальная переменная в методе Переменная не увеличивается в статическом методе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы
### Аннотация
Представлено исследование по разработке агентной модели микоризной. . .
|
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики
Контекст
Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
|
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии
Введение
Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
|
|
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np
class PlantAgent:
def __init__(self, name, strategy, initial_biomass):
self. name = name
self. strategy = strategy # "greedy" (широколиственные) или. . .
|
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли
Введение: Экологический рынок как игра с нулевой суммой
Традиционная экология долгое время. . .
|
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ
Введение: Синдром «цифрового учебника»
Современные большие языковые модели (LLM) обладают колоссальным. . .
|
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос.
Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех.
А широколиственный лес тоже имеет самую крутую биомассу.
То почему не возникло их симбиоза? Это. . .
|