2

私は MAC OS X 10.8.4 を使用しており、XCode とコマンド ライン ツール パッケージをダウンロードして gcc をインストールしました。ここに私のgccがあります:

Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

tr1 名前空間の新しい unordered_map を使用しようとしています。

using namespace std;
#include <tr1/unordered_map>

template<class T>
class A 
{
    tr1::unordered_map<T, int> * mymap;
    .....
    // key is of type T and value is of type int
    mymap->at(key) = value;
}

ただし、使用してマップ要素にアクセスしている行atはコンパイルされていません。次のエラーが表示されます。

error: 'class std::tr1::unordered_map<int, int, std::tr1::hash<int>, std::equal_to<int>, std::allocator<std::pair<const int, int> >, false>' has no member named 'at'

atC++ リファレンスには、マップの個々の要素にアクセスするために呼び出される関数が含まれているため、これはよくわかりません。マップ宣言を含むヘッダー ファイル (私のシステムでは/usr/include/c++/4.2.1/tr1/unordered_map) を調べようとしましたが、驚くべきことに、 という名前のメンバーが含まれていませんat

古いコンパイラが名前空間で新しい c++11 ライブラリをサポートしていない可能性があることは理解していますが、std名前空間の他の新しいライブラリのいくつかを使用できましたtr1。実際、 などの他の機能を使用できます。unordered_mapメンバーのみが欠落しています。findinsertat

これをコンパイルするにはどうすればよいですか?新しいコンパイラにアップグレードする必要がありますか? mac os x 用の新しいコンパイラがすぐに利用できるようには見えません。ゼロから構築する必要がありますか?

4

2 に答える 2

4

1)は、本質的に へのポインター を返すコンテナーunordered_mapの形式です。代わりに使用します。mapunordered_map::find(KeyType key)unordered_map::iteratorstd::pair< KeyType, ValueType >

または、変数unordered_map::operator[](KeyType key)が指す要素へのアクセスを取得するために使用できます。keyまだ存在しない場合は、新しい要素が作成されることに注意してください。

詳細については、 cppreference.comを参照してください。

2)新しいGCC(少なくとも4.7)を-std=c++11オプションで使用すると、std::unordered_map代わりに標準化されますtr1::unordered_map

于 2013-08-31T13:58:47.263 に答える
4

gcc のバージョンが低すぎます。その上、Apple がその背後にある力であるため、代わりに clang をインストールする必要があるかもしれません。

最新バージョンにアップグレードしたら、tr1もう使用しないでください。tr1は C++11 のドラフトであり、現在は非推奨です。

于 2013-08-31T13:59:36.710 に答える