Конфликт между определениями функций пространства имен и функций, не относящихся к пространству имен [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Конфликт между определениями функций пространства имен и функций, не относящихся к пространству имен [закрыто]

Сообщение Anonymous »

В заголовке внешней библиотеки, которую я использую, есть определение функции lerp следующим образом:

Код: Выделить всё

SUTIL_INLINE SUTIL_HOSTDEVICE float lerp(const float a, const float b, const float t)
{
return a + t*(b-a);
}
При компиляции с GCC 15.2.1 и -std=c++20 я получаю следующую ошибку:

Код: Выделить всё

In file included from /home/mori/software/KM3/eic-opticks/sysrap/sphoton.h:183,
from /home/mori/software/KM3/eic-opticks/sysrap/storch.h:37,
from /home/mori/software/KM3/eic-opticks/src/config.h:8,
from /home/mori/software/KM3/eic-opticks/src/config.cpp:14:
/home/mori/software/KM3/eic-opticks/sysrap/scuda.h:130:85: error: 'float lerp(float, float, float)' conflicts with a previous declaration
130 | SUTIL_INLINE SUTIL_HOSTDEVICE float lerp(const float a, const float b, const float t)
|                                                                                     ^
In file included from /usr/include/c++/15.2.1/valarray:41,
from /home/mori/software/install/cpp20/NLOHMANNJSON_v3.11.3/include/nlohmann/detail/conversions/from_json.hpp:21,
from /home/mori/software/install/cpp20/NLOHMANNJSON_v3.11.3/include/nlohmann/adl_serializer.hpp:14,
from /home/mori/software/install/cpp20/NLOHMANNJSON_v3.11.3/include/nlohmann/json.hpp:34,
from /home/mori/software/KM3/eic-opticks/src/config.cpp:9:
/usr/include/c++/15.2.1/cmath:3857:3: note: previous declaration 'constexpr float std::lerp(float, float, float)'
3857 |   lerp(float __a, float __b, float __t) noexcept
|   ^~~~
Насколько я понимаю, существует конфликт с std::lerp, который определен в стандартном заголовке cmath в пространстве имен std:: и охраняется как:

Код: Выделить всё

#ifdef __cpp_lib_interpolate // C++ >= 20
// linear interpolation

. . .

constexpr float
lerp(float __a, float __b, float __t) noexcept
{ return std::__lerp(__a, __b, __t); }
так что он доступен только с C++20 (и фактически при компиляции с C++17 ошибка исчезает).
Что я здесь не понимаю, так это то, почему функция в глобальном пространстве имен конфликтует с другой функцией в пространстве имен std::, даже в той же единице перевода. Я проверил отсутствие директивы using namespace std; в единице перевода, скомпилировав с флагом -E и проверив полученный исходный файл.
Мне нужно скомпилировать с помощью C++20, поэтому буду благодарен за любую помощь/подсказку.

Подробнее здесь: https://stackoverflow.com/questions/798 ... efinitions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»