VS 2017 错误 C2664 地图插入尝试

VS 2017 error C2664 map insert attempt

本文关键字:插入 地图 C2664 2017 错误 VS      更新时间:2023-10-16
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::p air &(":无法将参数 1 从"std::p air"转换为"std::p air &&&">

我在这里做错了什么?

亲切的问候,瓦迪姆。

PS:对不起,我应该澄清那一刻。还有这些定义:

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);
}

没有 MCVE 很难确定,但是看看你的例子,我看到的最明显的事情是在你的Thread类中thread handle。我假设这是一个 std::thread,如果是这样,std::thread 状态的文档

没有两个 std::thread 对象可以表示相同的执行线程; std::thread 不是 CopyConstructible 或 CopyAssignable,尽管它是 MoveConstructible 和 MoveAssignable。

要修复它,您必须实现移动运算符,以确保您的 Thread 类可以放置到容器中。

然后,您将能够std::move(th)到地图容器中,也可以使用map.emplace直接构建它

我建议阅读有关何时以及如何实现复制/移动的文章,因为很容易弄错这些东西,并且默认值可能已经足够好了。