для пользовательского класса в пространство имён std?
щас может ступлю но он вообще будет его искать в другом пространстве имен, а не глобальном или том где лежит класс которому нужен оператор?
Нет, добавление пользовательского кода (кроме специализаций) в std:: — это UB. https://en.cppreference.com/w/cpp/language/extending_std
Если не ошибаюсь, благодаря механизму adsl и тому, что первый аргумент будет из пространства std, компилятор в первую очередь будет смотреть туда. Или я таки не прав?
* ADL Он посмотрит везде одновременно, см. associated set https://en.cppreference.com/w/cpp/language/adl
Я таки понял, откуда взялся мой вопрос. У меня возникли траблы с тем, чтобы подружить одну конструкцию (из сторонней библиотеки) с библиотекой doctest: #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include "doctest/doctest.h" namespace ns { struct A { int i; A(int i) : i(i) {} bool operator == (const A & oth) const { return i == oth.i; } }; namespace overloads { std::ostream & operator << (std::ostream & os, const A & a) { return os << a.i; } } } //namespace std { using ns::overloads::operator <<; //} TEST_CASE("linalg_ostream_example") { CHECK_EQ(ns::A(1), ns::A(2)); } Если поместить using ns::overloads::operator << в std, doctest при провале теста даёт информативный вывод, а в глобальном пространстве он операторы не находит. Внутри у doctest довольно много всего, не могу точно сказать, почему так происходит. Можно это как-то правильно решить, не закидывая операторы в std и не меняя код ни одной из библиотек?
operator<< лежит не в глобальном пространстве, а в ns::overloads, и из-за этого конструкция std::cout << ns::A() работать не будет даже при помощи ADL. Что вы имеете в виду под "глобальным пространством"? А так можно StringMaker<T> специализировать: https://github.com/onqtam/doctest/blob/master/doc/markdown/stringification.md
Обсуждают сегодня