Nenhum tipo chamado 'unique_ptr' no namespace 'std' ao compilar sob LLVM / Clang
Estou recebendo um erro de compilação ao tentar usarunique_ptr
nas plataformas Apple com-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>;
Segundo Marshall Clow, que considero um especialista naBiblioteca padrão C ++ com Clang e Apple:
O Relatório Técnico nº 1 (TR1) foi um conjunto de adições de bibliotecas ao padrão C ++ 03. Representando o fato de não fazer parte do padrão "oficial", eles foram colocados no espaço de nome std :: tr1.
No c ++ 11, eles são oficialmente parte do padrão e vivem no namespace std, assim como vetor e string. Os arquivos de inclusão também não estão mais na pasta "tr1".
Aprendizado:
Apple e C ++ 03 = usam o espaço para nome TR1Apple e C ++ 11 = usam espaço para nome STDUsarLIBCPP_VERSION
detectarlibc++
Agora, aqui está o que eu tenhosmartptr.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
Eu acho que a última coisa a verificar é a__APPLE__
definir, e aqui está:
$ 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
Por que estou recebendo umerror: no type named 'unique_ptr' in namespace 'std'
ao usar-std=c++11
?
Eu acho que esses são os quatro casos de teste. Ele tenta exercitar as quatro configurações do produto cruzado de: {C ++ 03, C ++ 11} x {libc ++, libstdc ++}.
c ++ -c test-clapple.cxxEstá bemc ++ -stdlib = libc ++ -c test-clapple.cxxEstá bemc ++ -std = c ++ 11 -c test-clapple.cxxFALHOUc ++ -std = c ++ 11 -stdlib = libc ++ -c test-clapple.cxxEstá bemAqui está o driver de teste. Teste-o no OS X para obter todos os efeitos do espaço para nome TR1 em 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;
}