C++ 是叮当声';s c++;11支持可靠吗?

C++ 是叮当声';s c++;11支持可靠吗?,c++,c++11,compiler-errors,cgal,clang++,C++,C++11,Compiler Errors,Cgal,Clang++,我在尝试混合使用clang(Apple LLVM版本6.0(clang-600.0.56)(基于LLVM 3.5svn,目标:x86_64-Apple-darwin14.0.0)、c++11和CGAL(通过MacPorts)时遇到了一个有趣的问题 似乎我是否调用std::vector::reserve将决定我的程序是否会编译 我已将问题简化为一个最小的示例(尽可能小的CGAL示例): 无法编译。出现以下错误: In file included from example.cpp:1:

我在尝试混合使用clang(Apple LLVM版本6.0(clang-600.0.56)(基于LLVM 3.5svn,目标:x86_64-Apple-darwin14.0.0)、c++11和CGAL(通过MacPorts)时遇到了一个有趣的问题

似乎我是否调用std::vector::reserve将决定我的程序是否会编译

我已将问题简化为一个最小的示例(尽可能小的CGAL示例):

无法编译。出现以下错误:

    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 ==
或者禁用c++11

clang++ -c example.cpp -I/opt/local/include
  • 这是CGAL中的bug还是叮当声中的bug
  • 对于这种不稳定的编译器行为有什么解释
  • 有没有一种干净的方法可以避免这种情况(希望不会真正改变模板或函数原型设置,因为我需要解决方案来适应更大的项目)

  • 由于苹果的GCC已经过时(2007年的最新GPL v2版本,GCC 4.2.1),而且C++11功能还不完整(因此它附带了libstdc++),因此您可以通过MacPorts安装更现代的GCC版本(
    sudo port install gcc48
    sudo port install gcc49
    )这将为您提供更现代版本的libstdc++。我使用以下工具测试了您的代码:

    /opt/local/bin/g++-mp-4.8 -std=c++11 -c example.cpp -I/opt/local/include
    
    它编译成功

    如果您喜欢此解决方案并希望使用更干净的编译器调用,则可以使用
    GCC\u select
    命令将MacPorts的GCC设置为默认值(在我的gcc48示例中):

    只有一次。然后,您可以用

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

    在一个新的终端会话中。

    在XCode对
    是可转换的
    的定义中,这似乎是一个侥幸,但有这样一个bug是如此的不可能,以至于我的大脑拒绝接受它的存在。你知道正在使用哪个标准库吗?它与我的clang使用的是不同的。我不知道我的是什么,但顶部说“版权(C)2001年至2013年自由软件基金会”Clang似乎有libc++,而我有libstdc++如果我添加标志
    -stdlib=libc++
    ,那么情况不会改变。相反,如果我添加
    -stdlib=libstdc++
    ,那么没有版本编译,我会得到错误,比如
    错误:命名空间“std”中没有名为“forward”的模板;
    我推测您的
    libstdc++
    已经过时了-当时的日期。我希望检查代码,看看是否可以确定问题,但你和我有不同的代码。也许其他人可以研究它,希望我们很快就能知道错误在哪里。感谢你的解释。这是我的典型设置,但我现在的目标是让我的项目在mac上编译内置的叮当声:所以我不想nt切换编译器。C++11的哪个功能缺少此示例?谢谢。查看您在问题中的评论,当您使用Apple的
    libstdc++
    时,
    std::forward
    似乎缺少。很长(但希望有收获)方法是忽略MacPorts,自己用内置的clang编译CGAL及其所有依赖项。我自己从来没有这样做过,如果你这么做的话,我很想了解你的经验。另一种方法是向MacPorts的维护人员报告这些问题,等待他们更改CGAL及其依赖项的编译脚本谢谢。那么,这到底是CGAL中的一个bug,还是CGAL在某种程度上遇到的苹果libstdc++中的bug?我想说,这要么是MacPorts没有编译CGAL的“问题”,要么是它与苹果的clang和libc++的所有依赖关系,要么是苹果的libstdc++太旧了(这并不完全是一个bug,而是一个许可证问题,涉及使用GPLv3许可的libstdc++的较新版本,以及GPLv3中阻止苹果将其包含在OS X中的限制)。
    clang++ -c example.cpp -I/opt/local/include
    
    /opt/local/bin/g++-mp-4.8 -std=c++11 -c example.cpp -I/opt/local/include
    
    sudo port select --set gcc mp-gcc48
    
    g++ -std=c++11 -c example.cpp -I/opt/local/include