170 похожих чатов

Коллеги, допустимо ли помещать переопределённый operator << (std::ostream &, ...)

для пользовательского класса в пространство имён std?

7 ответов

11 просмотров

щас может ступлю но он вообще будет его искать в другом пространстве имен, а не глобальном или том где лежит класс которому нужен оператор?

Нет, добавление пользовательского кода (кроме специализаций) в std:: — это UB. https://en.cppreference.com/w/cpp/language/extending_std

Хитрый-Лис Автор вопроса
Kelbon
щас может ступлю но он вообще будет его искать в д...

Если не ошибаюсь, благодаря механизму adsl и тому, что первый аргумент будет из пространства std, компилятор в первую очередь будет смотреть туда. Или я таки не прав?

Хитрый Лис
Если не ошибаюсь, благодаря механизму adsl и тому,...

* ADL Он посмотрит везде одновременно, см. associated set https://en.cppreference.com/w/cpp/language/adl

Хитрый-Лис Автор вопроса
Egor Suvorov
* ADL Он посмотрит везде одновременно, см. associ...

Я таки понял, откуда взялся мой вопрос. У меня возникли траблы с тем, чтобы подружить одну конструкцию (из сторонней библиотеки) с библиотекой 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

Похожие вопросы

Обсуждают сегодня

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
32
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
а мы ещё не созрели до того, чтобы создать отдельный чатик про настройку редакторов?
Cheese Syrowiecki
16
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Всем привет! У меня почему-то по-разному отображается TListView в Debug и Release режимах (FireMonkey)! При запуске под Win приложения TListView заливается программо. в Debug ...
Александр COM
8
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
Парни, спасайте. RAD Studio 12 творит какую-то дичь. У меня есть метод (event), который вызывает другой метод, т.е. он состоит из 1-й строки вызова. Ставлю бряк на event, запу...
Eugene Krasnikov (ᴊɪɴ x)
3
окей, дело реально в org было. но что за мусор в конце?
Vi Chapmann
15
Карта сайта