for compile c++ c++11 compiler-errors cgal clang++

c++ - compile - llvm 3.7 1



¿El soporte c++ 11 de clang es confiable? (1)

Como el GCC de Apple está desactualizado (la última versión de GPL v2 de 2007, GCC 4.2.1) y no la característica C ++ 11 completa (de ahí el libstdc ++ provisto), puede instalar una versión más moderna de GCC a través de MacPorts ( sudo port install gcc48 o sudo port install gcc49 ) y eso le proporcionará una versión más moderna de libstdc ++. Probé tu código con:

/opt/local/bin/g++-mp-4.8 -std=c++11 -c example.cpp -I/opt/local/include

y compiló con éxito.

Si prefiere esta solución y quiere una llamada al compilador más limpia; puede establecer el GCC de MacPorts como predeterminado usando gcc_select con el comando (en mi caso para gcc48):

sudo port select --set gcc mp-gcc48

sólo una vez. Entonces, puedes compilarlo con solo

g++ -std=c++11 -c example.cpp -I/opt/local/include

en una nueva sesión de terminal.

Me encontré con un problema interesante cuando intentaba mezclar clang (Apple LLVM versión 6.0 (clang-600.0.56) (basado en LLVM 3.5svn, Target: x86_64-apple-darwin14.0.0), c ++ 11 y CGAL (a través de MacPorts )

Parece que si llamo o no a std::vector<>::reserve determinará si mi programa incluso compilará.

Reduje el problema a un ejemplo mínimo (tan mínimo como los ejemplos de CGAL):

#include <vector> #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_triangle_primitive.h> // CGAL::Epeck works fine, suggesting the problem is in CGAL::Epick typedef CGAL::Epick Kernel; typedef CGAL::Triangle_3<Kernel> Triangle_3; typedef typename std::vector<Triangle_3>::iterator Iterator; typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive; typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits; typedef CGAL::AABB_tree<AABB_triangle_traits> Tree; typedef typename Tree::Point_and_primitive_id Point_and_primitive_id; typedef CGAL::Point_3<Kernel> Point_3; template <typename BKernel> void A() { const CGAL::AABB_tree< CGAL::AABB_traits<BKernel, CGAL::AABB_triangle_primitive<BKernel, typename std::vector<CGAL::Triangle_3<BKernel> >::iterator > > > tree; Point_and_primitive_id pp = tree.closest_point_and_primitive(Point_3()); } void B() { std::vector<Triangle_3> T; #ifdef MAGIC T.reserve(0); #endif return A<Kernel>(); }

Emisor:

clang++ -std=c++11 -c example.cpp -I/opt/local/include

Esto no se puede compilar. Dando errores como:

In file included from example.cpp:1: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:265: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference:15: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:626: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility:157: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple:228:60: error: no member named ''value'' in ''std::__1::is_convertible<const CGAL::Point_3<CGAL::Epick> &, CGAL::Point_3<CGAL::Epick> >'' is_convertible<_Tp0, _Up0>::value && ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple:242:14: note: in instantiation of template class ''std::__1::__tuple_convertible_imp<true, std::__1::__tuple_types<const CGAL::Point_3<CGAL::Epick> &, const CGAL::Vector_3<CGAL::Epick> &>, std::__1::__tuple_types<CGAL::Point_3<CGAL::Epick>, CGAL::Vector_3<CGAL::Epick> > >'' requested here : public __tuple_convertible_imp<tuple_size<typename remove_reference<_Tp>::type>::value ==

Sin embargo, esto se compila si hago esta llamada mágica a std::vector::reserve , emitiendo:

clang++ -std=c++11 -c example.cpp -I/opt/local/include -DMAGIC

o al deshabilitar c ++ 11

clang++ -c example.cpp -I/opt/local/include

  1. ¿Es esto un error en CGAL o clang?
  2. ¿Qué explicación puede haber para un comportamiento errático del compilador?
  3. ¿Hay alguna forma clara de evitar esto (con suerte sin cambiar realmente la configuración del prototipo de plantilla o plantilla ya que necesito la solución para mi proyecto más grande).