Есть много проблем с использованием контейнеров в Qt.
Но куда нам без контейнеров - никуда. Данные надо удобно структурировано где-то хранить.
В какой-то момент мы вдруг начинаем хранить в контейнерах наши собственные классы, ну например как-то так:
QMap<int,const Tag_Value*>
QMap<int,Tag_Value> или так
QMap<int,const Tag_Value&> или даже так
и далее, когда вы начинаете заполнять контейнер может появится такая ошибка:
..\..\src\corelib\tools\qmap.h:569: error: C2582: 'operator =' function is unavailable in 'Tag_Value'
Много времени убито на то, чтобы понять что компилятору не хватает, хотя в описании ошибка явно сказано, что нужен оператор =.
Так вот он действительно нужен. И нужен в классе Tag_Value.
Ошибка эта кстати плохо диагностируется, так как среда Qt останавливается на файле qmap.h, конкретно вот здесь:
template <class Key, class T>
Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::insert(const Key &akey,
const T &avalue)
{
detach();
QMapData::Node *update[QMapData::LastLevel + 1];
QMapData::Node *node = mutableFindNode(update, akey);
if (node == e) {
node = node_create(d, update, akey, avalue);
} else {
concrete(node)->value = avalue;
}
return iterator(node);
}
Понятно, что мы в коде где-то вызывает insert( .. ) контейнеру.
Дело в том, что все контейнеры в Qt это шаблонные классы. Это как раз то, что все очень не любят изучать.
Тут в коде выше есть строчка:
concrete(node)->value = avalue; здесь идет присваивание нашего класса const T &avalue чему-то. А оператор = у нашего класса Tag_Value не реализован.
Поэтому надо всего-то реализовать этот оператор примерно так:
class Tag_Value
{
public:
/*
Tag_Value(); КОНСТРУКТОР ПО УМОЛЧАНИЮ УБРАН
последствия:
нельзя использовать map.insert map[]= , где значение контейнера тип Tag_Value
это тупик
что делать?
std::map имеет ту же проблему
*/
explicit Tag_Value(const QVariant &Val, const Tag_Info& tagInfo );
~Tag_Value();
QVariant val;
const Tag_Info tagInfo;
friend QDebug operator<<(QDebug d, const Tag_Value &val);
Tag_Value operator = (const Tag_Value& tgVal) const //!!!!!!!!!!!!!!!!
{
return *this;
}
};
Собственно и все решение проблемной ситуации.
Проверено на Qt 4.8.1 C++98 msvc2010.