我在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'
我不太明白这一点,因为C ++引用确实包含一个名为at
的函数来访问地图的各个元素。我试着查看包含地图声明的头文件(在我的系统上它位于/usr/include/c++/4.2.1/tr1/unordered_map
)并且令人惊讶的是,它不包含名为at
的成员。
我知道较旧的编译器可能不支持std
命名空间中的新c ++ 11库,但我已经能够使用tr1
命名空间中的一些其他新库。事实上,我可以使用unordered_map
的其他功能,例如find
,insert
等。只有成员at
丢失。
如何编译?我应该升级到更新的编译器吗?我没有看到新的编译器可用于mac os x。我应该从头开始构建吗?
答案 0 :(得分:4)
1)unordered_map
是map
包含的一种形式,而是使用unordered_map::find(KeyType key)
,返回unordered_map::iterator
,实际上是指向std::pair< KeyType, ValueType >
的指针。
或者您可以使用unordered_map::operator[](KeyType key)
来访问key
变量指向的元素。请注意,它将创建新元素,以防它尚未存在。
有关详细信息,请参阅cppreference.com。
2)使用具有-std=c++11
选项的较新GCC(至少4.7),您将获得标准化std::unordered_map
而不是tr1::unordered_map
答案 1 :(得分:4)
你的gcc版本太低了。此外,也许你应该安装clang,因为Apple是其背后的力量。
升级到最新版本后,不应再使用tr1
了。 tr1
是C ++ 11的草稿,现已弃用。