operator =

Есть много проблем с использованием контейнеров в 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.