При попытке скомпилировать эту строку с помощью 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 никогда не выдает постоянное выражение статическое значение BOOST_CHRONO_LIB_CONSTEXPR с плавающей точкой наименьшее () ... ^ /Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:355:21: note: функция non-constexpr 'max' не может использоваться в константном выражении return - (std :: numeric_limits :: max) (); ^ /usr/bin/../lib/c++/v1/limits:443:43: note: объявлено здесь _LIBCPP_INLINE_VISIBILITY статический тип 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 никогда не выдает постоянное выражение статическое BOOST_CHRONO_LIB_CONSTEXPR двойное наименьшее () ... ^ /Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:363:21: note: функция non-constexpr 'max' не может использоваться в константном выражении return - (std :: numeric_limits :: max) (); ^ /usr/bin/../lib/c++/v1/limits:443:43: note: объявлено здесь _LIBCPP_INLINE_VISIBILITY статический тип 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 никогда не выдает постоянное выражение статический BOOST_CHRONO_LIB_CONSTEXPR длинный двойной самый низкий () ... ^ /Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:371:21: note: функция non-constexpr 'max' не может использоваться в константном выражении return - (std :: numeric_limits :: max) (); ^ /usr/bin/../lib/c++/v1/limits:443:43: note: объявлено здесь _LIBCPP_INLINE_VISIBILITY статический тип max () _NOEXCEPT {return ... ^ Сгенерировано 3 ошибки.
Мне кажется, это ошибка в libc ++, потому что C ++ 11 требует, чтобы эти функции были constexpr
,
Кто-нибудь сталкивался с такой же проблемой, и вы можете согласиться? Знаете ли вы о каких-либо исправлениях?
Моя версия лязга:
Apple clang версия 4.1 (теги / Apple / clang-421.11.66) (на основе LLVM 3.1svn) Цель: x86_64-apple-darwin11.4.2 Модель потока: posix
С подсказкой Маркса я нашел обходной путь. определяющий BOOST_NO_CXX11_NUMERIC_LIMITS
помогает в этом случае. Похоже, что это неполная библиотека libc ++.
Согласно Говарду Хиннанту, это ошибка в libc ++, и она уже исправлена в транке. Однако пока нет информации, когда Apple сможет выпустить исправление в Xcode. Я отмечу вопрос, на который ответили пока.
РЕДАКТИРОВАТЬ: проблема исправлена в Apple LLVM версии 4.2 (clang-425.0.28) (на основе LLVM 3.2svn). Моя текущая версия XCode 4.6.3.
я использую boost в xcode 4.3 и использую tr1 random, fisrt также ошибка сборки, но я определил #define BOOST_HAS_TR1_RANDOM 1 перед #include и успешно собрал. Вы можете попробовать аналогичный способ, вручную указать, что у разработчика есть собственная реализация tr1. Возможно, это ошибка встроенного скрипта boost.