Нет типа с именем «unique_ptr» в пространстве имен «std» при компиляции в LLVM / Clang

Я ловлю ошибку компиляции при попытке использовать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>;

По словам Маршалла Клоу, которого я считаю экспертом поСтандартная библиотека C ++ с Clang и Apple:

Технический отчет № 1 (TR1) представлял собой набор библиотечных дополнений к стандарту C ++ 03. Ввиду того, что они не были частью «официального» стандарта, они были помещены в пространство имен std :: tr1.

В c ++ 11 они официально являются частью стандарта и живут в пространстве имен std, как вектор и строка. Включаемые файлы больше не находятся в папке «tr1».

Убери в сторону:

Apple и C ++ 03 = использовать пространство имен TR1Apple и 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 ++}.

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Хорошо

Вот тест-драйвер. Обязательно протестируйте его на OS X, чтобы получить все эффекты пространства имен TR1 в 2015 году.

$ 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;
}

Ответы на вопрос(1)

Ваш ответ на вопрос