株式会社エス・スリー・フォー

11.11 移行ガイド

このマニュアルの第 1 章「Tools.h++ の紹介」で説明したように、このバージョンの
Tools.h++ の主な目標の 1
つは、以前のバージョンのライブラリをもとにした既存のコードを再利用できるようにすることにあります。この章を見てわかるように、コレクションクラステンプレートは最新の標準
C++ ライブラリと適合するように大きく再設計されています。次に再設計されたクラスを示します。

  • RWTPtrDlist
  • RWTValDlist
  • RWTPtrHashDictionary
  • RWTValHashDictionary
  • RWTPtrHashSet
  • RWTValHashSet
  • RWTPtrHashTable
  • RWTValHashTable
  • RWTPtrOrderedVector
  • RWTValOrderedVector
  • RWTPtrSlist
  • RWTValSlist
  • RWTPtrSortedVector
  • RWTValSortedVector

これらのクラスはすべて、標準 C++
ライブラリの有無にかかわらず使用できることは先に説明しました。標準 C++
ライブラリなしで使用する場合、これらのクラスは、バグがいくつか訂正されているものの、前のバージョンの
Tools.h++
と同じインタフェースと実装を持ちます。これらのわずかな変更のために、既存コードとソースの互換性で問題が起きることはほとんどありません。

ただし、このクラスを標準 C++
ライブラリと一緒に使用する場合は、既存のソースコードにいくつかの変更を加えなければならない場合があります。特定のクラスで必要な調整については、以下に説明します。

追加のテンプレート引数が必要になったクラス:
  • RWTPtrHashDictionary
  • RWTValHashDictionary
  • RWTPtrHashSet
  • RWTValHashSet
  • RWTPtrHashTable
  • RWTValHashTable
  • RWTPtrSortedVector
  • RWTValSortedVector

これらのテンプレートを使用する既存のコードでは、標準 C++
ライブラリと共に使用するときにこのバージョンの Tools.h++
が必要とするテンプレート引数の数が指定されていません。この問題を解決するためには、
11.10.1
節で説明したマクロを使用してください。マクロを使用すると、コンパイルが通り、既存コードの意味論が保持されます。

クラス階層が変更されたクラス:
  • RWTPtrHashSet
  • RWTValHashSet
  • RWTPtrHashTable
  • RWTValHashTable
  • RWTPtrOrderedVector
  • RWTValOrderedVector
  • RWTPtrSortedVector
  • RWTValSortedVector

コレクションクラステンプレートの内の継承関係が既存コードに使用されている場合、標準 C++
ライブラリと共にこのバージョンの Tools.h++
を使用しても、そのコードはコンパイルされません。標準 C++
ライブラリのコレクションクラステンプレートの実装には、継承関係がありません。例えば、前のバージョンの
Tools.h++ では、RWTPtrHashSet
RWTPtrHashTable を、RWTValOrderedVector
RWTValVector を、そして
RWTValSortedVectorRWTValOrderedVector
を継承しています。これらのテンプレートのポインタベースのバージョンも同じようなパターンに従っています。これらの関係は、新バージョンの
Tools.h++
では保持されていません。この継承をもとにしたコードがある場合は、コードを変更する必要があります。

既存のコードでこの問題が発生する可能性のある場所は、RWTValHashSet から
RWTValHashTableIterator を、または
RWTPtrHashSet から
RWTPtrHashTableIterator を構築する箇所です。
RWTValHashTableIterator
のコンストラクタは、継承関係に依存するのではなく RWTValHashSetを利用して、
RWTValHashTable への参照を行うためです。

この特定の問題を解決するには、RWTPtrHashSetIterator を使用します。RWTValHashSet から RWTValHashTableIterator
を生成するコードを見つけたら、その代わりに RWTValHashSetIterator を使用してください。RWTValHashSetIterator は、標準 C++
ライブラリの有無にかかわらず用意されているので、あとで標準 C++
ライブラリベースの実装に移行する予定がある場合でも、すぐに変更することができます。

項目型に必要な less-than 意味論が影響を受ける可能性のあるクラス
  • RWTPtrDlist
  • RWTValDlist
  • RWTPtrOrderedVector
  • RWTValOrderedVector
  • RWTPtrSlist
  • RWTValSlist
  • RWTPtrSortedVector
  • RWTValSortedVector

前述したように、コンパイラの中には、項目型の 2 つのインスタンスに対して式 (t1
< t2)

が定義されていることを要求するものがあります。これは、使用されているかどうかにかかわらず、すべてのメンバ関数を具体化する特定のコンパイラと連合して、sort()
min_element()
などの便利なメンバ関数を含むためです。operator<()
が定義されていない型 T
でこれらのテンプレートのどれかを具体化するコードがあるかもしれません。その場合には、operator<()
を定義しなければなりません。

operator<()
を必要とするメンバ関数を実際に使用する場合は、最適の方法は実際に使用するやり方でそれを定義することです。手っ取り早い方法は、コンパイラを満足させるようなダミーの
operator<()
をグローバルに定義することです。しかし、「コンパイラを満足させる」ためだけに書かれたコードは、コードの保守管理上、悪夢のような状態を引き起こすことがかなりあるため、可能なかぎりこれは避けてください。