Название: Размещение QMap в библиотеке Отправлено: remach от Август 03, 2007, 11:00 Собираю библиотеку.
nmake выдает предупреждение: .\qmyclass.h(54) : warning C4251: 'fieldsConvertor' : class 'QMap<class QString,class QMap<class QString,class QString> >' needs to have dll-interface to be used by clients of class 'QMyClass' Строка 54: protected: FieldsConvertor fieldsConvertor; В начале файла объявлены типы: typedef QMap <QString, QString> OldNewConvertor; typedef QMap <QString, OldNewConvertor> FieldsConvertor; Подскажите, что это означает?, Хотелось сделать двумерный ассоциативный массив. Спасибо. Название: Размещение QMap в библиотеке Отправлено: Sergeich от Август 03, 2007, 13:32 Добавь строчки:
Код: template class YOUR_EXPORT_DEFINE QMap<QString, QString>; Название: Размещение QMap в библиотеке Отправлено: remach от Август 03, 2007, 13:51 Незнаю что такое обертка =(.
Скажите, где прочитать что это значит и в чем собственно проблема? Название: Размещение QMap в библиотеке Отправлено: Sergeich от Август 03, 2007, 14:06 Сие предупреждение (C4251) появляется когда ты собираешь DLL, и экспортитируешь в нее свой класс, в котором есть члены, использующие шаблоны. Для экспорта в DLL обычно используют обертки над __declspec(dllexport) типа
Код: #ifndef MY_EXPORT Код: typedef QMap <QString, QString> OldNewConvertor; Название: Размещение QMap в библиотеке Отправлено: remach от Август 03, 2007, 14:57 Помогло, спасибо огромное.
Возник вытекающий вопрос. В другом классе QMyClassList использую список QMyСlass. Получается там для: Код: typedef QValueList<QMyClass> RelationsList; Должно быть: Код: #ifndef MY_EXPORT результат: Цитата: "NMAKE" qksadon.h(36): Error: syntax error NMAKE : fatal error U1077: 'E:\work\qt3\bin\moc.exe' : return code '0x1' Stop. Странно, но при повторной попытке сборки проект собирается, однако пропадают ссылки на методы Q_OBJECT и мои сигналы: Цитировать ksacommon.obj : error LNK2001: unresolved external symbol "public: static class QMetaObject * __cdecl QMyClassList::staticMetaObject(void)" (?staticMetaObject@QKsaDo n@@SAPAVQMetaObject@@XZ) .... qmyclasslist.obj : error LNK2001: unresolved external symbol "protected: void __thisc all QMyClassList::signal1(class QString,class QString)" (?signal1@QMyClassList@@IAEX VQString@@0@Z) ... Название: Размещение QMap в библиотеке Отправлено: Sergeich от Август 03, 2007, 16:29 Использовать наследников QObject в контейнерах не гуд. Пользуйся указателями на объекты. Типа
Код: typedef QValueList<QMyClass*> RelationsList; добавлено спустя 2 минуты: А что такое QMyClassList ? Название: Размещение QMap в библиотеке Отправлено: remach от Август 03, 2007, 19:08 QMyClassList класс, который содержит:
Код:
QMyClass наследуется от QSqlCursor Код: class QMyClass: public QSqlCursor судя по Class Inheritance Hierarchy документации он не явлеется наследником QObject. Видимо мне лучше в данной ситуации воспользоваться QPtrList, но с ним таже проблема как и с QMap. P.S. А для наследников QObject скорее всего следует использовать QObjectList (QPtrList<QObject>). QT 3.3 Название: Размещение QMap в библиотеке Отправлено: Sergeich от Август 03, 2007, 19:21 Если в QMyClassList есть сигналы и слоты, ты забыл добавить Q_OBJECT
Код: class MY_EXPORT QMyClassList: public QWidget Название: Размещение QMap в библиотеке Отправлено: remach от Август 06, 2007, 18:17 Нет, не забыл, видимо действительно не стоит использовать QValueList для классов с макросом Q_OBJECT.
Переписал класс с использованием QPtrList: Код: typedef QPtrList<QMyClass> RelationsList; Все работает на отлично. P.S. Большое спасибо Sergeich за просвещение. |