2

この1行をclang+libc ++(C ++ 11モード)でコンパイルしようとすると:

#include <boost/thread.hpp>

clangは次のエラーを出します:

test.cpp:1からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread.hpp:13からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/thread.hpp:17からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/pthread/thread_data.hpp:11からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/locks.hpp:18からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/time_point.hpp:33からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:353:49:エラー:
  constexpr関数が定数式を生成することはありません
    static BOOST_CHRONO_LIB_CONSTEXPR float lower()..。
                        ^
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:355:21:注:
  非constexpr関数'max'は定数式では使用できません
    return-(std :: neuro_limits :: max)();
        ^
/usr/bin/../lib/c++/v1/limits:443:43:注:ここで宣言されています
_LIBCPP_INLINE_VISIBILITY static type max()_NOEXCEPT{return..。
                      ^
test.cpp:1からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread.hpp:13からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/thread.hpp:17からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/pthread/thread_data.hpp:11からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/locks.hpp:18からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/time_point.hpp:33からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:361:50:エラー:
  constexpr関数が定数式を生成することはありません
    static BOOST_CHRONO_LIB_CONSTEXPR double lower()..。
                         ^
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:363:21:注:
  非constexpr関数'max'は定数式では使用できません
    return-(std :: neuro_limits :: max)();
        ^
/usr/bin/../lib/c++/v1/limits:443:43:注:ここで宣言されています
_LIBCPP_INLINE_VISIBILITY static type max()_NOEXCEPT{return..。
                      ^
test.cpp:1からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread.hpp:13からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/thread.hpp:17からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/pthread/thread_data.hpp:11からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/thread/locks.hpp:18からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/time_point.hpp:33からインクルードされたファイル:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:369:55:エラー:
  constexpr関数が定数式を生成することはありません
    static BOOST_CHRONO_LIB_CONSTEXPR long double lower()..。
                          ^
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:371:21:注:
  非constexpr関数'max'は定数式では使用できません
    return-(std :: neuro_limits :: max)();
        ^
/usr/bin/../lib/c++/v1/limits:443:43:注:ここで宣言されています
_LIBCPP_INLINE_VISIBILITY static type max()_NOEXCEPT{return..。
                      ^
3つのエラーが生成されました。

C ++ 11ではこれらの関数がである必要があるため、これはlibc++のバグのように見えますconstexpr

誰もが同じ問題に遭遇しました、そしてあなたは同意できますか?修正について知っていますか?

私のclangバージョンは次のとおりです。

Apple clangバージョン4.1(tags / Apple / clang-421.11.66)(LLVM 3.1svnに基づく)
ターゲット:x86_64-apple-darwin11.4.2
スレッドモデル:posix
4

2 に答える 2

3

マルクスのヒントで、私は回避策を見つけました。BOOST_NO_CXX11_NUMERIC_LIMITSこの場合、ヘルプを定義します。したがって、それはlibc++の不完全さのようです。

ハワード・ヒナントによると、これはlibc ++のバグであり、トランクですでに修正されています。ただし、Appleが修正をXcodeにリリースできる時期についてはまだ情報がありません。今のところ答えた質問に印を付けます。

編集:この問題は、Apple LLVMバージョン4.2(clang-425.0.28)(LLVM 3.2svnに基づく)で修正されています。私の現在のXcodeバージョンは4.6.3です。

于 2013-01-14T13:18:22.460 に答える
2

xcode 4.3でboostを使用し、tr1ランダムを使用すると、fisrtもビルドエラーになりますが、#includeの前に#define BOOST_HAS_TR1_RANDOM 1を定義して、正常にビルドします。同様の方法を試すことができます。ビルダーが独自のtr1実装を持っていることを手動で指摘します。これは、ブーストのビルドスクリプトのバグである可能性があります。

于 2013-01-13T03:15:26.957 に答える