VS 2017 ошибка C2664 попытка вставки карты

class   Thread
{
Sync::TYPE  sync;       // synchronous start/finish
char        name[256];  // thread name
thread      handle;     // thread handle
HANDLE      abort,      // abort event handle
start;      // start event handle

public:
Thread(const char *desc,Sync::TYPE ctrl,void (*fn)(void *),void *arg=NULL);
Thread(Thread &th);
Thread(void);
~Thread(void);
HANDLE      AbortHandle(void) const     { return(abort); }
HANDLE      StartHandle(void) const     { return(start); }
thread::id  ID(void) const          { return(handle.get_id()); }
void        Name(const char *value);
const   char    *Name(void) const       { return(name); }
void        Sync(Sync::TYPE value)      { sync=value; }
Sync::TYPE  Sync(void) const        { return(sync); }
thread      *ThreadHandle(void)     { return(&handle); }
Thread      &operator=(Thread &th);
};

class   ThreadList
{
map<thread::id,Thread>  TiL;

public:
ThreadList(void);
~ThreadList(void);
HANDLE                  AbortHandle(void);
void                    Clear(void);
bool                    Close(thread::id id);
void                    Close(map<thread::id,Thread>::iterator pos);
map<thread::id,Thread>::iterator    Create(char *name,Sync::TYPE sync,void (*function)(void*),void *arg=NULL);
map<thread::id,Thread>::iterator    Find(thread::id id)             { return(TiL.find(id)); }
int                 Size(void) const                { return(TiL.size()); }
void                    Start(map<thread::id,Thread>::iterator pos);
HANDLE                  StartHandle(void);
};

Теперь этот код генерирует ошибку:

map<thread::id,Thread>::iterator    ThreadList::Create(char *name,Sync::TYPE sync,void (*function)(void*),void *arg)
{
pair<map<thread::id,Thread>::iterator,bool> result;
thread::id                  id;
Thread                      th(name,sync,function,arg);

id=th.ThreadHandle()->get_id();
**result=TiL.insert(make_pair(id,th));**
return(result.first);
}

Неисправная линия выделена жирным шрифтом. Точное сообщение об ошибке таково:

Ошибка C2664: ‘std :: _ Tree_iterator >> std :: _ Tree> :: insert (std :: _ Tree_const_iterator >>, const std :: pair &) ‘: невозможно преобразовать аргумент 1 из’ std :: pair ‘в’ std :: pair &&’

Что я здесь не так делаю?

С уважением, Вадим.

П.С .: Извините, я должен был прояснить этот момент. Также есть эти определения:

Thread::Thread(Thread &th)
{
sync=th.sync;
StrCopy(name,sizeof(name),th.name);
abort=th.abort;
start=th.start;
handle=move(th.handle);
}

Thread  &Thread::operator=(Thread &th)
{
sync=th.sync;
StrCopy(name,sizeof(name),th.name);
abort=th.abort;
start=th.start;
handle=move(th.handle);
return(*this);
}

0

Решение

Без MCVE трудно сказать наверняка, однако, глядя на ваш пример, наиболее очевидная вещь, которую я вижу, это thread handle в вашем Thread учебный класс. Я предполагаю, что это станд :: нить и если да, то документация для std :: thread состояний

Никакие два объекта std :: thread не могут представлять один и тот же поток выполнения;
std :: thread не является CopyConstructible или CopyAssignable, хотя это
MoveConstructible и MoveAssignable.

Чтобы исправить это, вам нужно будет реализовать операторы перемещения, чтобы гарантировать, что ваш класс Thread может быть вставлен в контейнеры.

Тогда вы либо сможете std::move(th) в контейнер карты или непосредственно построить его с map.emplace

Я бы посоветовал прочитать статьи о том, когда и как реализовать копирование / перемещение, поскольку очень легко ошибиться, и значения по умолчанию могут быть достаточно хорошими в любом случае.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector