3

これは重複した質問である必要があります。しかし、私はかなりグーグルで検索しましたが、私の問題を解決するヒットは見つかりませんでした.

osx lion で C++11 標準機能を使用しようとしていますが、機能しません。この機能はリスト初期化子と呼ばれると思います。http://clang.llvm.org/cxx_status.htmlによると、この機能はclang 3.1にあり、これは私が使用しているバージョンです。

以下は、私の簡単なテストを説明するシェル 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++

OSは

: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

使用しているバージョンは次のとおりです。

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.org3.1」以前のリビジョンに基づいており、最終的なLLVM.org3.1リリースのすべての機能を備えていない可能性があります。

Appleclang3.1は今ではちょっと古いです。それ以来、LLVM.orgは「3.1」と「3.2」のリリースを作成し、Appleは「Appleclang4.1」まで作成したと思います。Xcodeを更新するか、他の場所に最新バージョンのclangがインストールされているかどうかを確認する必要があります。

于 2013-01-10T19:40:05.283 に答える
4

-stdlib=libc++コンパイラ フラグに追加します。説明については、この投稿を参照してください。

于 2013-01-10T17:31:57.553 に答える
3

ソリューション

具体的には、XCode の設定 -> ダウンロードに移動し、「コマンド ライン ツール」をインストールする必要がありました。これで問題は解決しました。

説明

発生したのは、古いソフトウェアの単純なケースでした。OSX は (ソフトウェアの更新によって) 最新だったので、すべての XCode とコンパイラの更新も適切に行われていると想定しました。そうではありませんでした。

質問へのコメントで、「私は Lion 用の XCode の最新バージョンを持っています」と言ったことに注意してください。しかし、私はそうしませんでした.(bames53は彼の答えでそれをほのめかしています) OSXソフトウェアアップデートに新しいアップデートがないからといって、最新のXCodeコンパイラを持っているとは限りません. XCode 設定から更新します。

Jonathan のフィードバックといくつかのグーグルの助けを借りて、mac os x のコマンド ラインから libc++ および c++11 で clang を使用すると、問題が解決しました。

これにより、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 に答える