29

コンパイラが異なれば、TR1 についての考え方も異なるようです。G++ は次のタイプのインクルードのみを受け入れるようです:

#include <tr1/unordered_map>
#include <tr1/memory>
...

Microsoft のコンパイラは次のもののみを受け入れますが、

#include <unordered_map>
#include <memory>
...

私がTR1を理解している限り、Microsoftのやり方は正しいものです。

G++ に 2 番目のバージョンを受け入れる方法はありますか? 一般に、TR1 をポータブルな方法でどのように処理しますか?

4

6 に答える 6

17

マシンにブーストをインストールします。
次のディレクトリを検索パスに追加します。

<Boost インストール ディレクトリ>/boost/tr1/tr1

詳細はこちらをご覧ください

<memory> を含めると、std::tr1::shared_ptr を持つ tr1 バージョンのメモリが取得され、プラットフォーム固有のバージョンの <memory> が含まれて、通常の機能がすべて取得されます。

于 2009-08-04T17:35:36.020 に答える
14
#ifdef _WIN32
    #include <unordered_map>
    #include <memory>
#else
    #include <tr1/unordered_map>
    #include <trl/memory>
#endif
于 2010-07-15T20:20:12.720 に答える
4

多くの場合、TR1 機能と同様のインターフェイスを備えた代替手段があり、異なる (ただし一貫性のある) ヘッダー パスと名前空間にあるため、現時点では単純にboostライブラリを使用するのが最善の方法です。これには、 C++0x の実装をまだ開始していないコンパイラで作業できるという利点があります。そして、TR1 にはまったくない便利なブースト ライブラリがたくさんあります :)

または、G++ では、コマンド ラインで --std=gnu++0x を渡すこともできます。これは、少なくとも <unordered_set> と <unordered_map> で機能します。次に、std::tr1 で使用できるようにします。

namespace std { namespace tr1 { using namespace std; } }

当然、これは悪です。代わりにブーストアプローチを強くお勧めします:)

于 2009-08-04T16:08:17.587 に答える
3

少しハックかもしれませんが、コンパイラの tr1 ディレクトリをインクルード パスに追加するだけで済みます。

于 2009-08-04T16:08:32.360 に答える
2

Windows の場合は、「tr1」ディレクトリをシステム パスに追加します。その後、#include <memory>動作するはずです。

于 2009-08-04T16:09:02.903 に答える
2

私は自分自身に同じ質問をしました。残念ながら、テクニカル レポートには、ヘッダーをどのように含めるかは記載されていません。拡張機能が ::std::tr1 名前空間にある必要があることのみを定義します。

于 2009-09-21T18:44:16.150 に答える