Russian Qt Forum
Ноябрь 24, 2024, 19:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Размещение QMap в библиотеке  (Прочитано 5221 раз)
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;

Подскажите, что это означает?,
Хотелось сделать двумерный ассоциативный массив.
Спасибо.
Записан
Sergeich
Гость
« Ответ #1 : Август 03, 2007, 13:32 »

Добавь строчки:
Код:
template class YOUR_EXPORT_DEFINE QMap<QString, QString>;
template class YOUR_EXPORT_DEFINE QMap<QString, OldNewConvertor>;
YOUR_EXPORT_DEFINE - твое название обертки над __declspec(dllexport)
Записан
remach
Гость
« Ответ #2 : Август 03, 2007, 13:51 »

Незнаю что такое обертка =(.
Скажите, где прочитать что это значит и в чем собственно проблема?
Записан
Sergeich
Гость
« Ответ #3 : Август 03, 2007, 14:06 »

Сие предупреждение (C4251) появляется когда ты собираешь DLL, и экспортитируешь в нее свой класс, в котором есть члены, использующие шаблоны. Для экспорта в DLL обычно используют обертки над __declspec(dllexport) типа
Код:
#ifndef MY_EXPORT
  #include <qglobal.h>
  #ifdef Q_WS_WIN
    #define MY_EXPORT __declspec(dllexport)
  #else
    #define MY_EXPORT
  #endif
#endif // MY_EXPORT
Это переносимо на все платформы. В твоем случае должно быть что-то типа:
Код:
typedef QMap <QString, QString> OldNewConvertor; 
typedef QMap <QString, OldNewConvertor> FieldsConvertor;
template class MY_EXPORT QMap<QString, QString>;
template class MY_EXPORT QMap<QString, OldNewConvertor>;

class MY_EXPORT QMyClass
{
public:
...
protected:
  FieldsConvertor fieldsConvertor;
}
Записан
remach
Гость
« Ответ #4 : Август 03, 2007, 14:57 »

Помогло, спасибо огромное.
Возник вытекающий вопрос. В другом классе QMyClassList использую список QMyСlass. Получается там для:
Код:
typedef QValueList<QMyClass> RelationsList;

Должно быть:
Код:
#ifndef MY_EXPORT 
  #include <qglobal.h>
  #ifdef Q_WS_WIN
    #define MY_EXPORT __declspec(dllexport)
  #else
    #define MY_EXPORT
  #endif
#endif // MY_EXPORT

35: typedef QValueList<QMyСlass> RelationsList;
36: template class MY_EXPORT QValueList<QMyСlass> ;

результат:
Цитата: "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)
...
Записан
Sergeich
Гость
« Ответ #5 : Август 03, 2007, 16:29 »

Использовать наследников QObject в контейнерах не гуд. Пользуйся указателями на объекты. Типа
Код:
typedef QValueList<QMyClass*> RelationsList; 
template class MY_EXPORT QValueList<QMyClass*> ;


добавлено спустя 2 минуты:

 А что такое QMyClassList ?
Записан
remach
Гость
« Ответ #6 : Август 03, 2007, 19:08 »

QMyClassList класс, который содержит:
Код:

...
typedef QValueList<QMyСlass> RelationsList;
...
class QMyClassList: public QWidget
{
publc:
....
RelationsList relationsList;

}

QMyClass наследуется от QSqlCursor
Код:
class QMyClass: public QSqlCursor

судя по Class Inheritance Hierarchy документации он не явлеется наследником QObject.
Видимо мне лучше в данной ситуации воспользоваться QPtrList, но с ним таже проблема как и с QMap.
P.S. А для наследников QObject скорее всего следует использовать QObjectList (QPtrList<QObject>).
QT 3.3
Записан
Sergeich
Гость
« Ответ #7 : Август 03, 2007, 19:21 »

Если в QMyClassList есть сигналы и слоты, ты забыл добавить Q_OBJECT
Код:
class MY_EXPORT QMyClassList: public QWidget 
{
  Q_OBJECT
public:
Записан
remach
Гость
« Ответ #8 : Август 06, 2007, 18:17 »

Нет, не забыл, видимо действительно не стоит использовать QValueList для классов с макросом Q_OBJECT.
Переписал класс с использованием QPtrList:
Код:
typedef QPtrList<QMyClass> RelationsList;
template class MY_EXPORT QPtrList<QMyClass>;

Все работает на отлично.
P.S. Большое спасибо Sergeich за просвещение.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 21.