Объект обеспечения стандартной библиотечной поддержки C++ для квадмата может потребовать включения <boost/cstdfloat.hpp>
пре включение других заголовков.
Рассмотрим функцию, которая вызывает fabs(x)
и ранее вводила std::fabs()
в локальные рамки через , используя
директиву:
template <class T>
bool unsigned_compare(T a, T b)
{
using std::fabs;
return fabs(a) == fabs(b);
}
В этой функции правильная перегрузка fabs
может быть найдена через argument-dependent-lookup (ADL) или позвонив одному из std::fabs
перегрузка. Однако между ними есть ключевое различие: перегрузка в том же пространстве имен, что и T, и обнаруженная через ADL потребность не определяется в момент объявления функции. Однако все типы, заявленные в <boost/cstdfloat.hpp>
, являются фундаментальными типами, поэтому для этих типов мы полагаемся на поиск перегрузки, заявленной в области namespace std
. В этом случае, однако, все такие перегрузки должны быть объявлены до определения функции unsigned_compare
в противном случае они не считаются.
В случае, если <boost/cstdfloat.hpp>
был включен после определение вышеуказанной функции, правильная перегрузка fabs
, при наличии, просто не рассматривается как часть перегрузки. Таким образом, компилятор пытается сократить float128_t
аргумент сначала на long ДП
, затем на ДП
, затем на float
; компиляция терпит неудачу, потому что результат неоднозначный. Однако сообщение об ошибке компилятора будет выглядеть жестоко непознаваемым, по-видимому, безымянным номером строки и не упоминая float128
: слово амбигуатура является ключом к тому, что неправильно.
Предоставлено вам #include <boost/cstdfloat.hpp>
перед> включение любого заголовка, содержащего общий код плавающей точки (например, другой Boost). Math headers, then the compilationr will know about and use the std::fabs(std::float128_t)
, которые мы предоставляем в #include <boost/cstdfloatp>.