繁体   English   中英

VS 2017错误C2664映射插入尝试

[英]VS 2017 error C2664 map insert attempt

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: :对&&'

我在这里做错了什么?

亲切的问候,瓦迪姆。

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是MoveConstructible和MoveAssignable,但它不是CopyConstructible或CopyAssignable。

要解决此问题,您将必须实现移动运算符,以确保可以将Thread类放置到容器中。

然后,您将能够将std::move(th)放入地图容器,或直接使用map.emplace

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM