Задать вопрос
  • В visual studio для c++ пишет ошибки E0070. Как их убрать?

    @MarkusD Куратор тега C++
    Dyikot, ну вот. Поступают уточнения по контексту проблемы. Это клево. :)
    Давай коротко скажу. Даже в 25-м году пенять на неполную поддержку C++20 все еще рано.
    Да, уже вышел 23-й стандарт. Да, уже готовится фиксация 26-го стандарта. И что? подавляющее большинство производственного кода как было на C++17 и ранних стандартах, так и остается.
    Стимула быстро и точно вводить полную поддержку C++20 нет ни у кого из разработчиков трансляторов.
    Да, вот тут у тебя отрыгнуло студию. Нет, это не показатель. Потому что в другом месте отрыгнет GCC или Clang. Или Xcode дуба даст. Или плойкин/боксовый/сычевый транслятор, которые базируются на тех же LLVM и GCC. Или андроид тебе скажет: "А мы такое не поддерживаем, держите заглушечку".

    И я сейчас не занимаюсь адвокатурой проблемы в студии. Но вот о чем говорю: Ты ведь уже создал тикет в поддержке студии со своей проблемой? Создал же? Поди нет. А обсуждать проблему надо там. И людей надо туда звать, чтобы разработчики студии поскорее чесаться начали для исправления проблемы. Я так делаю с каждой проблемой поддержки стандарта, с которой сталкиваюсь. И мои тикеты довольно хорошо закрывают.
    Написано
  • В visual studio для c++ пишет ошибки E0070. Как их убрать?

    @MarkusD Куратор тега C++
    Dyikot, пока тут тоже не видно причины. Могу только сказать, что работая со студиями начиная с 2005-й и в шаблонах я такую ошибку видел только по делу. У меня бывают и поглубже цепочки псевдонимов, но вот поведения как у тебя я не наблюдал.

    В чем обычно причина такого поведения студии. У тебя есть проект, в котором есть шаблон в одном заголовке и некоторое подмножество псевдонимов этого шаблона в некотором наборе других заголовков. Проблема имеет место тогда, когда порядок включения заголовков перепутан между определением шаблона и определениями псевдонимов.
    При этом трансляция может проходить правильно потому что в файлах исходного кода, случайно или спланированно, порядок восстанавливается простым более ранним включением заголовка с шаблоном.
    Получить такую проблему в проекте с более чем 10 файлами проще простого. А чтобы разобраться в ней, нужно как минимум получить выдачу препроцессора, чего не умеют не только лишь все.

    Иными словами, это не столько проблема кода, сколько проблема структуры проекта и организации связей между файлами проекта.
    Написано
  • В visual studio для c++ пишет ошибки E0070. Как их убрать?

    @MarkusD Куратор тега C++
    Dyikot, рисуночки лишние (правила нарушают) и ни о чем не говорят по факту. Достаточно приложить лог сборки. Там все видно.
    E0070 говорит о том, что ты пробуешь пользоваться экземпляром определенного типа там, где этот тип еще не является полным.

    Опять же я тысячу раз видел как сборка при этом успешная, но ошибка использования неполного типа все равно есть и отображается правильно. Тысячу раз видел как люди пеняют на студию, а по сути у самих просто руки кривые и знаний нет.
    Ты не приводишь контекст относительно условий и места этой ошибки, а именно в контексте вся суть твоей проблемы.
    Написано
  • Почему размер .so в Android в разы больше чем аналогичный .dll для Windows?

    @MarkusD Куратор тега C++
    elfix , а почему набивка у PE и ELF обязана быть одинаковой на одинаковом исходном коде при том, что это полностью разные форматы с разными возможностями?

    Спасибо за ответ, разобрался - нужно было llvm-strip сделать.

    Это был не ответ, а комментарий. Ты точно разобрался? Тогда напиши грамотный ответ в области ответов и отметь его решением.
    Ты правильно понял что делает llvm-strip? Это поведение точно то, которое тебе нужно? Или ты просто оценил выполненную работу через размер выходного файла и успокоился на этом?
    Написано
  • Почему возникает ошибка при вызове вирутального метода в "operator="?

    @MarkusD Куратор тега C++
    Wataru , есть неточность, она вводит в заблуждение.
    Во-вторых, это проблема из-за правил поиска операторов. Они ищутся только в типах, которые участвуют в выражении, т.е. int и WidthProperty.

    Не из-за правила поиска операторов. Операторы ищутся по ADL по умолчанию или через QNL если постараться. Конкретно у автора вопроса действует правило инстанцирования методов шаблона. Запрос по ADL не приведет к инстанцированию, т.к. ADL опирается только на набор уже инстанцированных методов. Эту ключевую особенность можно, кстати, использовать в целях проверки доступности типов или вообще счетчик сделать, например.
    И вот чтобы оператор здесь у автора стал доступен после инстанцирования типа, его нужно явно инстанцировать в наследнике выражением, которое ты и привел в примере.
    Написано
  • Подключение VPN на клиенте через оптоволокно?

    Андрей Димаков , понимаешь какая штука. Ты сейчас в вопросе написал какой-то несвязный и бессмысленный текст.
    Вот для тебя он имеет какой-то свой смысл. А для связанных с сетевым оборудованием людей это - бессмыслица. Да и в комментариях, честно говоря, тоже что-то весьма неопрятное.
    И самая печаль (для тебя) в том, что это как раз тот случай, когда если надо объяснять, то не надо объяснять.

    Проблема - твоя, не наша. Чтобы ее описать для нас, тебе нужно обрести некоторое базовое образование самостоятельно. В правильно заданном вопросе кроется половина ответа. Это означает что для получения ответа нужна грамотность при составлении своего вопроса.
    Написано
  • Как вкорячить в вентилятор охлаждения pwm регулятор?

    runapa, все верно. Мать это понимает через два пина, которые на разъеме кулера закорочены на землю (5-6).
    Эти два пина на разъеме матери надо закоротить чтобы она думала будто у нее есть кулер.
    При этом вероятно мать будет бить тревогу что кулер есть, но не крутится. Это из-за датчика оборотов (4). Эту функцию на матери проще отключить чем твоими силами доставить на этот пин данные.
    Хотя... Вот как я писал выше, таким же образом, т.е. перепиновкой, можно из трехпинового входа регулятора сделать 6-пиновый разъем для матери. На контроллере теряется не больше 20мА судя по описанию, мать это бесчинство выдержит даже не заметив.
    Написано
  • Как вкорячить в вентилятор охлаждения pwm регулятор?

    runapa , а, вон чего. Это проприетарный HP-шный разъем.
    В такие моменты полезно сопровождать вопрос фотографиями. Однако...
    Я тут быстро глянул. Вопрос уже много лет как решен на redit: [1], [2], [3]. На том же али можно купить переходник с 4-pin PWM на этот разъем.
    Но тебе даже этот переходник не нужен, если у тебя есть 4-пиновый хвост от кулера. Можно просто перепаять провода по схеме или вообще вынуть пины из 6-пинового и вставить в 4-пиновый правильно.
    Написано
  • Как вкорячить в вентилятор охлаждения pwm регулятор?

    runapa , коротко: ты не понимаешь всё.
    У AFC0912DF трехпиновый разъем. Ты не приложил фотографии разъема, кулера и шелкографии на его плате. Гугл по артикулу показывает только трехпиновые версии.
    Регулятор имеет трехпиновый ввод, четырехпиновый выход с PWM и крутилку для подстройки скважности ШИМ-сигнала оборотов. У тебя не получится поженить трехпиновый кулер с PWM-выходом регулятора. Трехпиновые кулеры регулируются только через напряжение на входе.
    Чтобы регулировать обороты такого кулера, тебе нужен регулятор по напряжению, а не ШИМ-генератор.
    Написано
  • Какой выбрать сервопривод для детской кровати?

    FarikK, так, вот сейчас надо очень серьезно задуматься.
    Перед тем как делать подобные штуки, сперва следует самостоятельно изучить вопрос возможных нарушений у ребенка от неконтролируемого и продолжительного укачивания.
    Лично я полностью отказался от этой идеи когда почитал.

    Сама система - это Nema17, TMC2209 и STM/Arduino. Больше в железе ничего не надо, код надо мощный написать и панельку настроек сделать понятной для жены/тещи/няни.
    Но ты забудешь. Забудешь выключить вовремя, забудешь поставить правильное время, забудешь поставить правильную амплитуду, забудешь периодически контролировать. А все эти автоматические качалки необратимо влияют на ребенка. Готов ли ты пойти на такой эксперимент со своим собственным ребенком?
    Написано
  • Возможно ли перегрузить с помощью ограничений?

    @MarkusD Куратор тега C++
    Dyikot, правильно что не видишь как выбирать. У тебя наблюдается тупиковая ситуация.
    Перегрузка имени - это инструмент поддержки подобия. Перечитай про LSP. Перегрузки должны позволять расширение вглубь множества типов элемента. У тебя перегрузка на предикат вообще не соотносится с множеством типов элемента. Т.е. ты нарушаешь LSP таким действием.
    В случае шаблона функции перегрузок у тебя в целом существовать не должно. Перегрузки шаблона функции нужны только для обработки специфичных аргументов в рамках одной системы типов.

    По поводу переименования. Там буквально плачет и просится вариант: Ranges::FirstOrDefault::ByValue и Ranges::FirstOrDefault::ByCriteria.
    Написано
  • Возможно ли перегрузить с помощью ограничений?

    @MarkusD Куратор тега C++
    Dyikot, а если элементами твоей коллекции являются объекты std::function, как ты планируешь выбирать перегрузку Ranges::FirstOrDefault?
    Твой предикат - это функтор. Твои элементы коллекции - это функторы. Как быть?
    Написано
  • Почему двоится изображение на мониторе?

    neison,
    а не опасно в холодную вытягивать кабель и тем более подключать его заново?

    Привет. :)
    На холодную - это при полностью выключенном железе.
    На горячую - это в момент работы железа.
    Оба варианта безопасны. HDMI или DP гальванически развязаны на обоих концах, выравнивание потенциалов при подключении не требуется.

    Причем если первый был во время часовой и более сессии, то последующие могли продолжаться каждые 15 минут.

    А это может говорить о перегреве видеокарты. Конкретно это может быть локальный малодетектируемый перегрев управляющего элемента на плате. Возможно из-за высокого напряжения. Собственно SpecteRED написал об этом и теперь уже именно эта гипотеза выглядит самой вероятной.

    Есть предположение насчет 2х видеоадаптеров (одновременно с основной видеокартой работает встроенная от ryzen).

    Только это не ноут. При подключении дискретки встроенное граф.ядро процессора отключается наглухо. Иначе мы бы уже давно использовали его для нужд физики. Но возможности на самом деле нет.
    Написано
  • Почему не работает оператор for each в C++?

    @MarkusD Куратор тега C++
    Adamos, ты прав. По ошибке все сразу понятно. И исправление легко делается своими силами.

    alikhan_hero, вот что ты написал:
    int numbers[rows][columns] = { {1, 2}, {5, 4}, {9, 7} };

    Чем твой код отличается от кода ниже?
    using IntColumns = int[ columns ];
    using IntMatrix = IntColumns[ rows ];
    
    IntMatrix numbers = { {1, 2}, {5, 4}, {9, 7} };

    Каким должен быть тип значения для цикла по numbers в обоих случаях?
    Что вернет std::begin( numbers ); в обоих случаях и какой тип будет у этого результата?
    Написано
  • Почему не работает оператор for each в C++?

    @MarkusD Куратор тега C++
    Adamos, на auto&& тогда уж. Действительно, зачем человеку разбираться в тонкостях и деталях, когда можно просто бахнуть обобщение и пойти дальше. :)
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, для информации.
    Тут только прототип коллбека, т.е. тот же функтор. Все описано в репке. Не советую использовать этот код, я не задумывал его для использования в проектах.
    Возможно код натолкнет тебя на какие-нибудь выводы. В моем коде все многократно серьезнее чем в этом прототипе, но событие и коллбек сделаны схожим с прототипом образом.
    Ну и советую посмотреть на libsigc++ еще.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, требуй от пользователя только минимальную информацию для работы твоего кода.
    Выводи недостающие для работы твоего кода части исходя из полученной от пользователя информации своими руками.
    Тебя ведь ничто не останавливает от того, чтобы самостоятельно инстанцировать функтор из std::function из параметров шаблона события.

    У тебя д.б. так:
    template< typename >
    class Event;


    Частичная специализация защищает тебя от пользователя, которому захотелось странного.
    template< typename TResult, typename... TArguments >
    class Event<TResult ( TArguments... )> final
    {
    };


    Дальше в этом коде у тебя все сразу под контролем. Выведи тип функтора, откажись от шаблонов операторов, используй выведенный тип функтора в операторах, используй параметры TResult и TArguments для определения оператора функционального вызова.
    Шаблон простой как три копейки. Тебе незачем делать его сложнее. :)
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, так. Но зачем тебе std::function здесь? Для чего ты обязываешь своего пользователя инстанцировать шаблон события именно таким образом?
    Ведь это ни тебе(писателю шаблона), ни ему(пользователю шаблона) не нужно.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, но я ведь не ругался на саму шаблонность события. :)
    Я ругался только на то, что у шаблона класса события есть шаблоны методов. Ты контроль потерял только из-за этого и сейчас из-за этого же пытаешься свой код подотунуть костылями.
    Приведенный код никуда в плане качества не сдвинулся. Он такой же неудачный.

    Наследоваться от стандартных типов - весьма порочная практика. Наследование - это вообще очень узкий инструмент. Оно подходит только тогда, когда ты можешь контролировать переходы объектов по иерархии наследования. У тебя же тут даже LSP у хендлера не соблюдается. Т.е. снова плохой код. Но позволь мне не вдаваться в объяснения, ведь тебе лучше все изучить и понять самому, почему я говорю именно так.

    Подумай, каким образом из template< typename > можно получить и тип результата функции, и типы всех ее параметров всего за одну частичную специализацию шаблона.
    Тебе не нужно передавать в событие тип хендлера.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, если разобрался, то и хорошо.

    Не будешь против моего личного мнения? :)
    Код Event никуда не годится. Он неконтролируемый вообще.
    Ты пишешь его как шаблон. В качестве аргумента инстанцирования передаешь тип хендлера, от которого внутри инстанцируешь тип поля - коллекцию хендлеров.
    И вот именно с этого момента у тебя все должно быть под контролем и полностью известно, но нет. не в твоем коде.

    void operator+=(auto&& handler)
    Это называется обобщенной функцией. Тут у тебя оператор. Он обобщенный. Что это значит?
    auto&& - это универсальное обобщение. Конкретный тип из него будет выведен в момент передачи аргумента.
    Конкретный оператор у тебя из обобщенного будет выведен для типа каждого из переданных для его вызова хендлеров. Буквально в этот оператор ты можешь передавать все что только захочется и код будет пытаться собраться. Внутри оператора, в строчке
    _handlers.emplace_front(std::forward<decltype(handler)>(handler));
    код будет пытаться привести переданный тобой хендлер к типу THandler.
    Насколько я вижу, ты используешь C++20 и тебе доступно неявное приведение стандартных функторов. В результате C++20 только усугубляет тебе проблему в коде, позволяя то, что ты написал.

    Что у нас дальше.
    template<typename TObject, typename TEventArgs> requires std::derived_from<TEventArgs, EventArgs>
    void operator()(TObject* sender, const TEventArgs& e) const

    Это шаблон оператора функционального вызова. Этот оператор из твоего события делает функциональный объект или функтор.
    Но у тебя это шаблон. А инстанцируется он от любых аргументов, которые ты ему передаешь. И внутри кода шаблона у тебя код неявного приведения аргументов к типам параметров THandler.
    И этот процесс ты вообще никак не контролируешь.

    Этот код вообще никуда не годен. От него отказаться надо, наверное, прямо со вчера. Сегодня ты чуть-чуть переписал этот код, но по сути не сделал ничего полезного. И от этого кода все равно нужно отказаться.
    Вот такое мнение вызвал твой код у человека, который ежедневно через code review проживает добрых 4 часа своей рабочей жизни.
    Если спросишь про то, как тогда должно быть чтобы код был успешным, то я только предложу тебе изучить для начала как определяются и записываются типы функций и обратить пристальное внимание на то, как инстанцируются функторы из шаблона std::function. Постарайся разобраться с возможностями, которые тебе открывает мой совет.
    Написано