Объект обеспечения стандартной библиотечной поддержки 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>.