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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему некоторые классы не хотят быть базовым типом массивов?  (Прочитано 2767 раз)
fulkabaster
Гость
« : Март 22, 2010, 19:39 »

Например, юзая графики из библиотеки QWT, хочу создать кучку маркеров для подписей. Чтобы не создавать их десятками вручную, делаю массив типа QVector<QwtPlotMarker>. Но при компиляции выдается такое:

Цитировать
../qwt/qwt-5.2.0/src/qwt_plot_item.h: In copy constructor ‘QwtPlotMarker::QwtPlotMarker(const QwtPlotMarker&)’:
../qwt/qwt-5.2.0/src/qwt_plot_marker.h:46:   instantiated from ‘void QVector<T>::realloc(int, int) [with T = QwtPlotMarker]’
/usr/include/QtCore/qvector.h:303:   instantiated from ‘void QVector<T>::resize(int) [with T = QwtPlotMarker]’
chargaff.cpp:107:   instantiated from here
../qwt/qwt-5.2.0/src/qwt_plot_item.h:192: error: ‘QwtPlotItem::QwtPlotItem(const QwtPlotItem&)’ is private
../qwt/qwt-5.2.0/src/qwt_plot_marker.h:46: error: within this context
/usr/include/QtCore/qvector.h: In member function ‘void QVector<T>::realloc(int, int) [with T = QwtPlotMarker]’:
/usr/include/QtCore/qvector.h:475: note: synthesized method ‘QwtPlotMarker::QwtPlotMarker(const QwtPlotMarker&)’ first required here

Причем пробовал заменить массив с QVector на QList и даже на просто vector<> из STL - нифига.
Можно пофиксить?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Март 22, 2010, 19:50 »

Причина ошибки в том, что:

Цитировать
QList's value type must be an assignable data type.

Цитировать
The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator.

а согласно сообщению об ошибке:

Код
C++ (Qt)
error: ‘QwtPlotItem::QwtPlotItem(const QwtPlotItem&)’ is private

копирующий конструктор запривачен.

Побороть можно:

Код
C++ (Qt)
QList<QwtPlotMarker *> list;
....
 
list.append(new QwtPlotMarker());

Незабывает только освобождать память выделенную под элементы листа.

Вышесказанное праведливо и для QVector.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
SASA
Гость
« Ответ #2 : Март 22, 2010, 20:15 »

Можно отнаследоваться от QwtPlotMarker и определить конструктор копирования и оператор присваивания. Но делать это крайне аккуратно, прочитав http://doc.trolltech.com/4.4/object.html#identity-vs-value
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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