Ошибка компиляции, thread C++

98
14 июня 2021, 02:50
class Buff {
public:
    void use(Mob& mob_passive) {
        ::std::thread threading{&Buff::apply_buff, this, mob_passive}; // Пробовал с this и без него
        threading.detach();
    }
    void apply_buff(Mob& mob_passive) {
        use_all_buffs(mob_passive);
        Sleep(seconds * 1000);
        complete(mob_passive);
        delete this;
    }
....

Выдаёт ошибку:

C2672 "std::invoke": не найдена соответствующая перегруженная функция - xthread:238

C2893 Сбой при специализации функции-шаблона "unknown-type std::invoke(_Callable &&,_Types &&...) noexcept()" - xthread:237

Answer 1

Сделал рабочий код из Вашего, заменив mob_passive на std::ref(mob_passive) в третьем аргументе конструктора:

class Buff {
public:
    void use(Mob& mob_passive) {
        ::std::thread threading{&Buff::apply_buff, this, std::ref(mob_passive)}; // Пробовал с this и без него
        threading.detach();
    }
    void apply_buff(Mob& mob_passive) {
        use_all_buffs(mob_passive);
        Sleep(seconds * 1000);
        complete(mob_passive);
        delete this;
    }
....

По всей видимости, проблема была в том, что ссылка автоматически разыменовывается везде, где Вы её используете. Следовательно в метод apply_buff передавалось значение типа Mob вместо Mob&. В std есть функция для получения ссылки из значения – ref, которую можно использовать для передачи ссылки в качестве аргумента функции.

P.S. При попытке воспроизвести Ваш код, уже после запуска программы, она крашнулась из-за delete this;. Не уверен, что это хорошо.

READ ALSO
Как получить открытый ключ из структуры DH

Как получить открытый ключ из структуры DH

Пытаюсь испробовать в действии алгоритм Диффи-ХеллманаВзял код отсюда:

83
c++ lambda expression пр компиляции

c++ lambda expression пр компиляции

Во многих гуидах написано, что лямбда выражения в с++ это всего лишь синтаксический сахар для анонимных функторовНо при обработке, скажем,...

107
jquery keypress не видит 1 символ

jquery keypress не видит 1 символ

Подскажите, почему выводит -1 символ?

77