Нет типа с именем «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;
}