为什么有些包含文件只驻留在tr1中?

时间:2011-10-24 02:50:30

标签: c++ c++11 clang tr1 libc++

当我尝试包含诸如<unordered_map>之类的内容时,它会失败并说该文件不存在,而当我尝试包含<tr1/unordered_map>时它会起作用。但是,找到了c ++ 03中存在的包含文件,并且是c ++ 11(如<vector>有移动构造函数)。此外,通常也会找到仅在c ++ 11而不在tr1中的标题,例如<thread> 它就像tr1中的所有内容一样被抛入tr1文件夹,其他所有内容都包含在内 为什么会这样?没有修改源文件,有没有修复? 传递-I/path/to/include/tr1将不起作用,因为所有内容都在tr1命名空间中 我正在使用的编译器是

Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)

3 个答案:

答案 0 :(得分:11)

TR1(技术报告1)不是标准,而仅是报告。这是让人们知道委员会对这个领域感兴趣的官方方式。任何tr1实现都是一个实验性版本,旨在获得现场反馈,以便改进未来的标准。

使用Apple的Xcode 4.2,你可以通过搜索“libc ++”的构建设置来选择一个几乎完整的C ++ 11库,然后选择“libc ++”作为C ++标准库(它不是默认的)。

或者,如果您更喜欢命令行,则可以使用-stdlib = libc ++。

libc ++不包含任何tr1组件,但包含除<atomic>之外的所有C ++ 11。

答案 1 :(得分:7)

两个以下参数添加到clang ++:

-std=c++11 -stdlib=libc++ 

答案 2 :(得分:1)

是的,不同的编译器对TR1标头的处理方式不同。例如,GCC与您经历的事情相同,而MVS接受<unordered_map>。解决它的一种方法是使用boost/tr1/unordered_map.hpp如果您需要跨平台或多个编译器编译。