Здравствуйте. Продолжаю постигать хитросплетения С++. На этот раз решил попробовать написать уже динамическую библиотеку (то есть .dll) для упрощенной работы с GUI Windows. Все классы и необходимые функции экспортируются - __declspec(dllexport)
. Все было хорошо, но дело в том что у меня во многих классах по задумке должны быть атрибуты отвечающие за различные события, они в виде лямбд (например std::function<void()> onPaint_
и прочие). И вот когда я добавил лямбды как атрибуты своего класса - стали появляться warning'и при компиляции. А именно вот такого содержания:
class "std::function" должен иметь dll-интерфейс для использования клиентами class "wquery::Window"
Не совсем понимаю в чем суть и что имеется в виду? Лямба, это ведь по сути объект шаблонного класса (или я ошибаюсь)? То есть я не могу использовать в интерфейсе какие-то сторонние объекты, у которых.. нет.. __declspec(dllexport)
в их классах? Или что? Это потому-что.. на той платформе, где будет использоваться .dll, классы этих объектов могут быть не теми что используются при ее сборке? В этом дело? Но как тогда правильно подойти к этой задаче?
Я попробовал использовать указатель (то есть std::function<void()>* onPaint_
), тогда варнинги исчезают, возникает другая проблема - как обратиться к лямбде как к функции (чтобы вызвать ее), когда у меня есть только указатель на объект лямбды? То есть если раньше я мог делать вот так - window->onPaint_()
, то теперь такое, понятное дело, не срабатывает. Я пытался делать что-то вот такое - *(window->onPaint_)()
, но компилятор на это тоже ругается.
В общем хотелось бы понять, как лучше подойти к этому всему. Может быть я делаю что-то в корне не правильное? За ранее спасибо.
std::function<void()>
это ни разу не лямбда. Если требуется использовать этот класс в интерфейсе библиотеки то его придется экспортировать из библиотеки иначе в библиотеке и использующем ее коде будет рассинхрон. Класс можно экспортировать явно инстанцировав его указав спецификатор экспорта:
template class DLL_API ::std::function<void (void)>;
где DLL_API
- __declspec(dllexport)
или __declspec(dllimport)
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Как изменить цвет рамки в классическом приложении WinAPI? Как менять фон, я разобралсяА как задать не системный цвет окна? Допустим, у меня цветовая...
ЗдравствуйтеПоможет-ли кто-нибудь решить и подробно разобрать код и объяснить? По учебе задано