윈도 비스타에서는 어쩔 수 없이 VS2005 SP1을 사용해야 한다. 그런데 윈도 비스타에서 VS2005 SP1을 사용하여 아마 QMap/QHash가 들어간 프로그램을 컴파일하는데 오류가 생겼다. 다행히토 트롤텍은 둘러가기 패치를 제공하고 있었지만, 이마저도 듣지 않았다. 그래서 이 문제 가지고 MSDN과 각종 Qt 포럼이 아직도 들썩대고 있다.
그런데 그 둘러가기 패치의 코드와 내가 가지고 있는 Qt의 문제성 헤더의 줄 번호가 약간씩 차이가 났다. 그리고 둘러가기 패치는 그 주변 코드를 알 수가 없어서 뭐가 문젠지 알아내는 데 시간이 좀 걸렸다. 실제로 내가 적용시킨 것은 다음과 같다.
<QHash.h>
일단 390줄 부근에서 찾기 바란다.
private:
// ### Qt 5: remove
inline operator bool() const { return false; }
};
friend class const_iterator;
typedef typename QHash<Key, T>::iterator DummyHashIterator;
// STL style
inline iterator begin() { detach(); return iterator(d->firstNode()); }
inline const_iterator begin() const { return const_iterator(d->firstNode()); }
그리고 한 890줄 부근에 있다.
public:
QMultiHash() {}
QMultiHash(const QHash<Key, T> &other) : QHash<Key, T>(other) {}
inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value);
inline typename QHash<Key, T>::iterator insert(const Key &key, const T &value);
inline typename DummyHashIterator replace(const Key &key, const T &value);
inline typename DummyHashIterator insert(const Key &key, const T &value);
inline QMultiHash &operator+=(const QMultiHash &other)
{ unite(other); return *this; }
파란색 부분을 찾은 다음 지우고 빨간색으로 바꾸면 된다.
<QMap.h>
310줄 부근에서 찾기 바란다.
private:
// ### Qt 5: remove
inline operator bool() const { return false; }
};
friend class const_iterator;
typedef typename QMap<Key, T>::iterator DummyMapIterator;
// STL style
inline iterator begin() { detach(); return iterator(e->forward[0]); }
inline const_iterator begin() const { return const_iterator(e->forward[0]); }
그리고 한 890줄 부근에 있다.
public:
QMultiMap() {}
QMultiMap(const QMap<Key, T> &other) : QMap<Key, T>(other) {}
inline typename QMap<Key, T>::iterator replace(const Key &key, const T &value);
inline typename QMap<Key, T>::iterator insert(const Key &key, const T &value);
inline typename DummyMapIterator replace(const Key &key, const T &value);
inline typename DummyMapIterator insert(const Key &key, const T &value);
inline QMultiMap &operator+=(const QMultiMap &other)
{ unite(other); return *this; }
파란색 부분을 지우고 빨간색 부분으로 바꾸기 바란다. 그 결과 해결되는 척 하였다.