3

这应该是一个重复的问题。但是我用谷歌搜索了很多,但没有找到解决我问题的方法。

我正在尝试在 osx lion 上使用 c++11 标准功能,但它不起作用。我相信这个特性被称为列表初始化器。根据http://clang.llvm.org/cxx_status.html这个功能在 clang 3.1 中,这是我正在使用的版本。

下面是解释我的简单测试的 shell o/p。谁能告诉我我做错了什么?我忘了一面旗帜吗?

编译器是:

:tmp$ c++ --version
Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix
:tmp$ which c++
/usr/bin/c++
:tmp$ ls -alt /usr/bin/c++
lrwxr-xr-x  1 root  wheel  7 Jul 12 13:17 /usr/bin/c++ -> clang++

操作系统是

:tmp$ uname -a
Darwin .local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64

测试文件是

:tmp$ cat test.cpp
#include <vector>

int main(){
  std::vector<int> vec1 {1,2,3};
  std::vector<int> vec2={1,2,3};
}

编译器输出是

:tmp$ c++ -std=c++11 test.cpp
 test.cpp:4:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec1 {1,2,3};
                   ^    ~~~~~~~
test.cpp:5:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec2={1,2,3};
                   ^    ~~~~~~~
2 errors generated.

好的,我不想到达那里,因为在stackoverflow上正确格式化以下内容需要很多时间。但是添加 -stdlib=c++ 会产生更多问题。现在我得到 14 个错误。

:tmp$ c++ -std=c++11 -stdlib=libc++ test.cpp 
In file included from test.cpp:1:
In file included from /usr/bin/../lib/c++/v1/vector:261:
In file included from /usr/bin/../lib/c++/v1/__bit_reference:15:
In file included from /usr/bin/../lib/c++/v1/algorithm:591:
/usr/bin/../lib/c++/v1/type_traits:737:2: error: #error is_base_of not
      implemented.
#error is_base_of not implemented.
 ^
/usr/bin/../lib/c++/v1/type_traits:1700:13: error: use of undeclared identifier
      'is_base_of'
            is_base_of<_Class, typename remove_reference<_Tp>::type>::value>
            ^
/usr/bin/../lib/c++/v1/type_traits:1700:24: error: '_Class' does not refer to a
      value
            is_base_of<_Class, typename remove_reference<_Tp>::type>::value>
                   ^
/usr/bin/../lib/c++/v1/type_traits:1697:28: note: declared here
template <class _Rp, class _Class, class _Tp>
                           ^
/usr/bin/../lib/c++/v1/type_traits:1700:62: error: expected class name
            is_base_of<_Class, typename remove_reference<_Tp>::type>::value>
                                                             ^
In file included from test.cpp:1:
In file included from /usr/bin/../lib/c++/v1/vector:261:
In file included from /usr/bin/../lib/c++/v1/__bit_reference:15:
In file included from /usr/bin/../lib/c++/v1/algorithm:594:
In file included from /usr/bin/../lib/c++/v1/memory:590:
In file included from /usr/bin/../lib/c++/v1/typeinfo:61:
/usr/bin/../lib/c++/v1/exception:194:20: error: use of undeclared identifier
      'is_base_of'
                  !is_base_of<nested_exception, typename ...
               ^
/usr/bin/../lib/c++/v1/exception:194:31: error: 'nested_exception' does not
      refer to a value
                  !is_base_of<nested_exception, typename ...
                              ^
/usr/bin/../lib/c++/v1/exception:166:29: note: declared here
class _LIBCPP_EXCEPTION_ABI nested_exception
                            ^
/usr/bin/../lib/c++/v1/exception:194:81: error: parameter declarator cannot be
      qualified
  ...typename remove_reference<_Tp>::type>::value
                                   ~~^
/usr/bin/../lib/c++/v1/exception:194:85: error: expected ')'
  ...typename remove_reference<_Tp>::type>::value
                                         ^
/usr/bin/../lib/c++/v1/exception:192:18: note: to match this '('
throw_with_nested(_Tp&& __t, typename enable_if<
                 ^
/usr/bin/../lib/c++/v1/exception:213:19: error: use of undeclared identifier
      'is_base_of'
                  is_base_of<nested_exception, typename ...
              ^
/usr/bin/../lib/c++/v1/exception:213:30: error: 'nested_exception' does not
      refer to a value
                  is_base_of<nested_exception, typename ...
                         ^
/usr/bin/../lib/c++/v1/exception:166:29: note: declared here
class _LIBCPP_EXCEPTION_ABI nested_exception
                            ^
/usr/bin/../lib/c++/v1/exception:213:80: error: parameter declarator cannot be
      qualified
  ...typename remove_reference<_Tp>::type>::value
                                   ~~^
/usr/bin/../lib/c++/v1/exception:213:84: error: expected ')'
  ...typename remove_reference<_Tp>::type>::value
                                         ^
/usr/bin/../lib/c++/v1/exception:211:18: note: to match this '('
throw_with_nested(_Tp&& __t, typename enable_if<
                 ^
test.cpp:4:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec1 {1,2,3};
                   ^    ~~~~~~~
test.cpp:5:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec2={1,2,3};
                   ^    ~~~~~~~
14 errors generated.
4

3 回答 3

4

添加-stdlib=libc++到您的编译器标志。请参阅此帖子以获取解释。

于 2013-01-10T17:31:57.553 回答
4

您使用的版本是:

Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)

尽管上面写的是“3.1”,但实际上与您查看的C++ 状态页面所指的“3.1”不同。Apple 版本和 LLVM.org 版本本质上是不相关的。

Apple clang 3.1 版“基于 LLVM 3.1svn”,这意味着它基于 LLVM.org 源代码存储库中的“LLVM.org 3.1”预修订版,可能不具备最终 LLVM.org 3.1 版本的所有功能。

Apple clang 3.1 现在有点老了。从那时起,LLVM.org 已经发布了“3.1”和“3.2”版本,我认为 Apple 已经发布了“Apple clang 4.1”。您应该更新 Xcode 或查看其他地方是否安装了更新版本的 clang。

于 2013-01-10T19:40:05.283 回答
3

解决方案

具体来说,我必须去 XCode 首选项-> 下载并安装“命令行工具”。这解决了问题。

说明

发生的只是一个过时软件的简单案例。由于 OSX 是最新的(通过软件更新),我假设所有 XCode 和编译器更新也都已到位。事实并非如此。

请注意对我所说的“我有最新版本的 XCode for Lion”问题的评论。但我没有。(bames53 在他的回答中提到了这一点)仅仅因为您在 OSX 软件更新中没有任何新更新并不意味着您拥有最新的 XCode 编译器。您可以通过 XCode Preferences 更新它。

在乔纳森的反馈和更多谷歌搜索的帮助下,在 mac os x 的命令行中将 clang 与 libc++ 和 c++11 一起使用解决了我的问题。

这实际上更新了 llvm 工具链。

$ c++ --version
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix
于 2013-01-10T18:47:07.237 回答