Странная ошибка с использованием массива классов для потока C ++ - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь вызвать Thread класс повара через вектор, но я не знаю, как это сделать правильно. Вот мой код:

for (int i = 0; i < _numCooks; i++) {
     std::thread threadObj(this->_cooks[i].nextOrder, void);
    _threads.push_back(threadObj);
}

_cooks - это вектор класса, а функция, которую я пытаюсь создать потоком:

bool cooks::nextOrder()
{
    Margarita margarita(_cookOrder[0].pizzaSize);
    Regina regina(_cookOrder[0].pizzaSize);
    Fantasia fantasia(_cookOrder[0].pizzaSize);
    Americana americana(_cookOrder[0].pizzaSize);
    if (_cookOrder.empty())
        return (false);
    switch (_cookOrder[0].pizzaType) {
        case plazza::Margarita:
            return (makeOrder(margarita));
            break;
        case plazza::Regina:
            return (makeOrder(regina));
            break;
        case plazza::Fantasia:
            return (makeOrder(fantasia));
            break;
        case plazza::Americana:
            return (makeOrder(americana));
            break;
        default:
            return (false);

    }
}

, однако, когда я пытаюсь скомпилировать Я получаю это:

кухня / кухня. cpp: в функции-члене void Kitchen :: make_pizza (std :: __ cxx11 :: string, std :: __ cxx11 :: string, Ip c) ': кухня / кухня. cpp: 148: 59: ошибка: ожидаемое первичное выражение перед' void 'std :: thread threadObj (this -> _ cooks [i] .nextOrder, void); ^ ~~~ кухня / кухня. cpp: 148: 63: ошибка: недопустимое использование нестатической c функции-члена 'bool cooks :: nextOrder ()' std :: thread threadObj (this -> _ cooks [i ] .nextOrder, недействительно); ^ В файле из kitchen / kitchen.hpp: 17, из kitchen / kitchen. cpp: 5: kitchen / cooks.hpp: 32: 10: note: здесь объявлено bool nextOrder (); ^ ~~~~~~~~ В файле, включенном из /usr/include/c++/8/x86_64-redhat-linux/bits/c++allocator.h:33, из / usr / include / c ++ / 8 / bits /allocator.h:46, из / usr / include / c ++ / 8 / string: 41, из /usr/include/c++/8/bits/locale_classes.h:40, из / usr / include / c ++ / 8 / bits /ios_base.h:41, из / usr / include / c ++ / 8 / ios: 42, из / usr / include / c ++ / 8 / ostream: 38, из / usr / include / c ++ / 8 / iostream: 39 , из кухни /../ pizza / IPizza.hpp: 23, из кухни /../ pizza / APizza.hpp: 11, из кухни / kitchen.hpp: 8, из кухни / кухни. cpp: 5: / usr / include / c ++ / 8 / ext / new_allocator.h: при создании экземпляра void __gnu_cxx :: new_allocator <_Tp> :: construct (_Up *, _Args && ...) [с _Up = cooks; _Args = {const повара &}; _Tp = cooks] ': /usr/include/c++/8/bits/alloc_traits.h:475:4: требуется от' static void std :: allocator_traits :: construct (std :: allocator_traits> :: allocator_type &, _Up *, _Args && ...) [с _Up = cooks; _Args = {const повара &}; _Tp = повара; std :: allocator_traits> :: allocator_type = std :: allocator] '/usr/include/c++/8/bits/stl_vector.h:1079:30: требуется от' void std :: vector <_Tp, _Allo c> :: push_back (const value_type &) [с _Tp = cooks; _Allo c = std :: allocator; std :: vector <_Tp, _Allo c> :: value_type = cooks] 'kitchen / kitchen. cpp: 36: 30: требуется отсюда /usr/include/c++/8/ext/new_allocator.h:136 : 4: ошибка: использование удаленной функции 'cooks :: cooks (const cooks &)' {:: new ((void ) __ p) _Up (std :: forward <_Args> (__args) ...); } ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ В файле из kitchen / kitchen.hpp: 17, из kitchen / kitchen. cpp: 5: kitchen / cooks.hpp: 21: 7: note: 'cooks :: cooks (const cooks &)' неявно удаляется, потому что определение по умолчанию было бы неправильно сформировано: class cooks ^ ~~~~ kitchen / cooks.hpp: 21: 7: error: использование удаленной функции 'std :: basic_ofstream <_CharT, _Traits> :: basic_ofstream ( const std :: basic_ofstream <_CharT, _Traits> &) [с _CharT = char; _Traits = std :: char_traits] 'В файле, включенном из kitchen /../ plazza.hpp: 15, из kitchen / kitchen.hpp: 13, из kitchen / kitchen. cpp: 5: / usr / include / c ++ / 8 / fstream: 778: 7: note: здесь объявлен basic_ofstream (const basic_ofstream &) = delete; ^ ~~~~~~~~~~~~~ В файле, включенном из / usr / include / c ++ / 8 / vector: 62, из кухни /../ pizza / IPizza.hpp: 24, из кухни / .. /pizza/APizza.hpp:11, из kitchen / kitchen.hpp: 8, из kitchen / kitchen. cpp: 5: /usr/include/c++/8/bits/stl_construct.h: в экземпляре 'void std :: _ Construct (_T1 , _Args && ...) [с _T1 = cooks; _Args = {cooks}] ': /usr/include/c++/8/bits/stl_uninitialized.h:83:18:
требуется от' stati c _ForwardIterator std :: __ uninitialized_copy <_TrivialValueTypes> :: __ uninit_copy (_InputIterator, _InputIterator, _InputIterator, , _ForwardIterator) [с _InputIterator = std :: move_iterator; _ForwardIterator = готовит *; bool _TrivialValueTypes = false] '/usr/include/c++/8/bits/stl_uninitialized.h:134:15: требуется от' _ForwardIterator std :: uninitialized_copy (_InputIterator, _InputIterator, _ForwardIterator) [с _InputI :: _ForwardIterator = cooks *] '/usr/include/c++/8/bits/stl_uninitialized.h:289:37: требуется от' _ForwardIterator std :: __ uninitialized_copy_a (_InputIterator, _InputIterator, _ForwardIterator, std :: [allocator] с _InputIterator = std :: move_iterator; _ForwardIterator = готовит *; _Tp = cooks] '/usr/include/c++/8/bits/stl_uninitialized.h:311:2: требуется от' _ForwardIterator std :: __ uninitialized_move_if_noexcept_a (_InputIterator, _InputIterator, _ForwardIterators, _Al _ForwardIterator = готовит *; _Allocator = std :: allocator] '/usr/include/c++/8/bits/vector.tcc:447:6:
требуется из' void std :: vector <_Tp, _Allo c>: : _M_realloc_insert (std :: vector <_Tp, _Allo c> :: iterator, _Args && ...) [с _Args = {const cooks &}; _Tp = повара; _Allo c = std :: allocator; std :: vector <_Tp, _Allo c> :: iterator = __gnu_cxx :: __ normal_iterator>; typename std :: _ Vector_base <_Tp, _Allo c> :: pointer = cooks *] '/usr/include/c++/8/bits/stl_vector.h:1085:4: требуется от' void std :: vector <_Tp , _Allo c> :: push_back (const value_type &) [с _Tp = cooks; _Allo c = std :: allocator; std :: vector <_Tp, _Allo c> :: value_type = cooks] 'kitchen / kitchen. cpp: 36: 30: требуется отсюда /usr/include/c++/8/bits/stl_construct.h:75 : 7: ошибка: использование удаленной функции 'cooks :: cooks (const cooks &)' {:: new (static_cast (__ p)) _T1 (std :: forward <_Args> (__args) ...); } ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ make: *** [: kitchen / kitchen.o] Ошибка 1

Есть ли способ исправить?

1 Ответ

0 голосов
/ 07 мая 2020

Согласно this , первый аргумент конструктора std::thread должен соответствовать концепции Callable . Затем вы передаете последующие аргументы для Callable в качестве дополнительных аргументов конструктору.

Вы передаете функцию-член. Вам нужен экземпляр класса для вызова метода, который вы не предоставляете. Вот что должна означать для вас эта ошибка.

error: invalid use of non-static member function ‘bool cooks::nextOrder()’

Вероятно, проще всего использовать лямбда ie.

for (int i = 0; i < _numCooks; i++) {
    _threads.emplace_back([&cook = _cooks[i]]() {
        cook.nextOrder();
     });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...