boost::format("%s") % i
вызывает вызов operator<<
.Во время компиляции соблюдается правило поиска имени, чтобы найти operator<<
.
. Для boost::format("%s") % t
и struct SomeType
, и std::ostream& operator<<(std::ostream& os, const SomeType& t)
определены в глобальном пространстве имен, с помощью ADL найден operator<<
.
Для (boost::format("%s") % i)
, std::optional
определено в пространстве имен std
, но соответствующее operator<<
определено в глобальном пространстве имен.Используя ADL, boost не сможет его найти.И
поиск без ADL проверяет объявления функций с внешними связями, которые видны из контекста определения шаблона,
, поэтому компилятор не может найти operator<<
который вы определили.
Обходной путь: wrap std :: необязательный внутри вашего собственного ReferenceWrapper, затем определите вставщик для вашей оболочки в том же пространстве имен, где определен ReferenceWrapper.