gpt4 book ai didi

c++11 - 在 LLVM/Clang 下编译时,命名空间 'unique_ptr' 中没有名为 'std' 的类型

转载 作者:行者123 更新时间:2023-12-03 22:45:55 26 4
gpt4 key购买 nike

我在尝试使用时遇到编译错误 unique_ptr在 Apple 平台上使用 -std=c++11 :

$ make
c++ -std=c++11 -DNDEBUG -g2 -O3 -fPIC -march=native -Wall -Wextra -pipe -c 3way.cpp
In file included ...
./smartptr.h:23:27: error: no type named 'unique_ptr' in namespace 'std'
using auto_ptr = std::unique_ptr<T>;
~~~~~^
./smartptr.h:23:37: error: expected ';' after alias declaration
using auto_ptr = std::unique_ptr<T>;

根据 Marshall Clow 的说法,我认为他是 C++ Standard Library with Clang and Apple 的专家:

Technical Report #1 (TR1) was a set of library additions to the C++03 standard. Representing the fact that they were not part of the "official" standard, they were placed in the namespace std::tr1.

In c++11, they are officially part of the standard, and live in the namespace std, just like vector and string. The include files no longer live in the "tr1" folder, either.



带走:
  • Apple 和 C++03 = 使用 TR1 命名空间
  • Apple 和 C++11 = 使用 STD 命名空间
  • 使用 LIBCPP_VERSION检测 libc++

  • 现在,这是我在 smartptr.h 中的内容:
    #include <memory>

    // Manage auto_ptr warnings and deprecation in C++11
    // Microsoft added template aliases to VS2015
    #if (__cplusplus >= 201103L) || (_MSC_VER >= 1900)
    template<typename T>
    using auto_ptr = std::unique_ptr<T>;
    #else
    using std::auto_ptr;
    #endif // C++11

    我认为最后要检查的是 __APPLE__定义,这里是:
    $ c++ -x c++ -dM -E - < /dev/null | grep -i apple
    #define __APPLE_CC__ 6000
    #define __APPLE__ 1
    #define __VERSION__ "4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)"
    #define __apple_build_version__ 5030040

    为什么我会收到 error: no type named 'unique_ptr' in namespace 'std' 使用时 -std=c++11 ?

    我认为这是四个测试用例。它尝试从以下的交叉产品中练习四种配置:{C++03,C++11} x {libc++,libstdc++}。
  • 时间:2019-05-06 标签:c++-ctest-clapple.cxx
  • 好的
  • c++ -stdlib=libc++ -c test-clapple.cxx
  • 好的
  • c++ -std=c++11 -c test-clapple.cxx
  • 失败
  • c++ -std=c++11 -stdlib=libc++ -c test-clapple.cxx
  • 好的

  • 这里是测试驱动程序。请务必在 OS X 上对其进行测试,以便在 2015 年获得 TR1 命名空间的全部效果。
    $ cat test-clapple.cxx

    // c++ -c test-clapple.cxx
    // c++ -stdlib=libc++ -c test-clapple.cxx
    // c++ -std=c++11 -c test-clapple.cxx
    // c++ -std=c++11 -stdlib=libc++ -c test-clapple.cxx

    #include <memory>

    // Manage auto_ptr warnings and deprecation in C++11
    #if (__cplusplus >= 201103L) || (_MSC_VER >= 1900)
    template<typename T>
    using auto_ptr = std::unique_ptr<T>;
    #else
    using std::auto_ptr;
    #endif // C++11

    int main(int argc, char* argv[])
    {
    return argc;
    }

    最佳答案

    And the CFE Devs specifically told me to use that code;



    不,他们没有。如果你想使用 shared_ptr,他们告诉你做类似的事情。 , 因为对于 C++03 <tr1/memory>定义 std::tr1::shared_ptr和 C++11 <memory>定义 std::shared_ptr .

    但你没有使用 shared_ptr .如果您想使用 auto_ptr那么它只是 std::auto_ptr , 处处,始终在 <memory> 中定义.

    我认为你误解了编码(marshal)的评论,你把事情复杂化了。您引用的内容('在 c++11 中,它们正式成为标准的一部分,并且存在于命名空间 std 中,就像向量和字符串一样。包含文件也不再存在于“tr1”文件夹中。')是不是 Apple 特定的或 Clang 特定的,它适用于所有编译器。但由于 auto_ptr从未成为 TR1 的一部分,也从未在 <tr1/memory> 中TR1 的内容现在在命名空间 std 中无关紧要,因为您尝试使用的内容从未包含在 TR1 中。

    您不应该使用 TR1 完全这里。
    # include <memory>

    // Manage auto_ptr warnings and deprecation in C++11
    #if (__cplusplus >= 201103L)
    template<typename T>
    using auto_ptr = std::unique_ptr<T>;
    #else
    using std::auto_ptr;
    #endif // C++11

    这对于现代编译器来说应该是正确的,但不适用于 XCode 附带的愚蠢配置,它是 Clang 的现代版本,支持 C++11 和来自 GCC 4.2 的 libstdc++,它已有近十年的历史并且没有支持 unique_ptr .

    为了处理默认的 OS X 工具链,这是有效的:
    #include <memory>

    #if __cplusplus >= 201103L
    # ifdef __clang__
    # if __has_include(<forward_list>)
    // either using libc++ or a libstdc++ that's new enough to have unique_ptr
    # define HAVE_UNIQUE_PTR 1
    # endif
    # else // not clang, assume unique_ptr available
    # define HAVE_UNIQUE_PTR 1
    # endif
    #endif

    #ifdef HAVE_UNIQUE_PTR
    template<typename T> using auto_ptr = std::unique_ptr<T>;
    #else
    using std::auto_ptr;
    #endif

    这通过使用 <forward_list> 的存在而起作用。作为标准库 clang 是否使用支持的指标 std::unique_ptr .

    如果 clang 使用 libc++ 作为其标准库,则所有版本都支持 unique_ptr并提供 <forward_list> ,所以测试通过。

    如果 clang 正在使用 libstdc++ 那么是否 unique_ptr是否支持取决于 libstdc++ 版本。 unique_ptr在 GCC 4.3 中添加到 libstdc++,与添加 <forward_list> 的版本相同,因此如果该 header 可用,则 unique_ptr也会。如果您将 clang 与 Apple 工具链(来自 GCC 4.2)一起提供的古老 libstdc++ 一起使用,那么 unique_ptr不支持,但也不支持 <forward_list> ,所以测试失败,你使用 auto_ptr反而。

    这应该适用于在野外发现的任何 GCC/libstdc++、Clang/libc++ 或 Clang/libstdc++ 组合。我不知道 VC++/Dinkumware 和 Clang/Dinkumware 需要什么,从您的回答看来,您可能只需将第一个条件更改为:
    #if __cplusplus >= 201103L || _MSC_VER >= 1600

    关于c++11 - 在 LLVM/Clang 下编译时,命名空间 'unique_ptr' 中没有名为 'std' 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31655462/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com