Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在GCC和MSVC中使用TR1库_C++_Visual C++_Gcc_Tr1 - Fatal编程技术网

C++ 在GCC和MSVC中使用TR1库

C++ 在GCC和MSVC中使用TR1库,c++,visual-c++,gcc,tr1,C++,Visual C++,Gcc,Tr1,我想使用现代版本的GCC和MSVC附带的TR1库,但有一些细微的区别:我不得不说,在GCC中 #include <tr1/memory> std::tr1::shared_ptr<int> X; #include <memory> std::shared_ptr<int> X; #包括 std::tr1::shared_ptr X; 在MSVC的时候我不得不说 #include <tr1/memory> std::tr1::sha

我想使用现代版本的GCC和MSVC附带的TR1库,但有一些细微的区别:我不得不说,在GCC中

#include <tr1/memory>
std::tr1::shared_ptr<int> X;
#include <memory>
std::shared_ptr<int> X;
#包括
std::tr1::shared_ptr X;
在MSVC的时候我不得不说

#include <tr1/memory>
std::tr1::shared_ptr<int> X;
#include <memory>
std::shared_ptr<int> X;
#包括
std::共享_ptr X;
我有两个问题:1)MSVC是自动在C++0x模式下运行(相当于GCC的std=C++0x),还是默认情况下也在C++98/03模式下工作?2) 如何统一包含空间和名称空间?我在考虑一个“INCLUDE_TR1(memory)”之类的预处理器宏

为了澄清,我想使用传统的标准C++98/03;不是C++0x(否则就不会有问题)

如果有任何建议,我将不胜感激

  • VC++2010仅在C++0x模式下运行;以前的版本不支持C++0x。也就是说,VC++2010中的许多标准库仍然基于TR1(例如,的
    std::result\u使用协议的TR1 result\u,而不是基于
    decltype
    );事实上,VC++2010中的许多标准库实际上并不是在名称空间
    std
    中定义的,而是在名称空间
    std::tr1
    中定义的,并使用using指令拉入名称空间
    std
  • 使用。-它将根据您的平台
    #包含相应的头文件,或者如果您的平台不支持TR1,则
    #包含相应的Boost实现,并使用声明将它们拉入命名空间
    std::TR1

  • MSVC的不同版本具有它们所具有的功能。没有办法打开或关闭它们


    其中一些可能还具有某些功能的tr1和std版本。语义稍有不同

    VC++2010始终在C++0x模式下运行,但类同时存在于
    std
    std::tr1
    名称空间中。您必须使用
    \if\u MSC\u VER
    来检测编译器,以选择要包含的头文件(请参阅)


    该库可以自动包含编译器的标题,并使用Boost填充任何缺少的功能。这可能会有所帮助。

    好的,在Boost.TR1出现了几个不一致和不可协调的问题后,特别是在尝试使用GCC的原生TR1库时,我决定完全放弃Boost,使用一个小的#定义解决方法。这是我的“tr1.h”:


    std::tr1::shared_ptr在我的MSVC10上工作。MF:谢谢。TG:如果您能给出最一般的答案,我们将不胜感激!非常感谢。但是有人告诉我(买Windows的人)“std::tr1::shared\u ptr”不起作用;他们必须使用std::shared\u ptr。我是不是记错了?如果名称空间总是被认为是“std::tr1”,那么这已经是问题的一半了。@Kerrek SB:我不知道你在说什么;在VC++2010中,没有对
    std::shared\u ptr
    的定义,只有一个
    std::tr1::shared\u ptr
    的定义,该定义通过using指令拉入命名空间
    std
    。当然,使用std::tr1::shared_ptr是安全的。好吧,我不知道,因为我没有编译器。我想有人告诉我,为了使我的GCC代码正常工作,他们必须用std::tr1::shared_ptr替换std::shared_ptr,但他们可能没有测试std::tr1::shared_ptr。非常感谢你澄清这一点!带有TR1修补程序的Visual Studio 2008需要命名空间中的
    TR1
    。但是,IIRC,GCC需要头路径中的
    tr1
    ,Visual Studio 2008和tr1补丁只需将新内容添加到旧头。我们正在使用CMake。我现在正在玩Boost.TR1。我使用CMake找到Boost,并将“-D Boost_HAS_GCC_TR1”添加到GCC选项中(并且不对MSVC选项进行任何更改),并将所有头转换为C++0x样式(等等)。祝你好运。谢谢你给出的所有答案,以及关于Boost.TR1的提示!现在我该接受谁的回答呢?