【问题标题】:VS 2017 error C2664 map insert attemptVS 2017 错误 C2664 地图插入尝试
【发布时间】:2018-06-15 07:35:58
【问题描述】:
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 &&'

我在这里做错了什么?

亲切的问候,瓦迪姆。

P.S.:对不起,我应该在那一刻澄清一下。也有这些定义:

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

【问题讨论】:

  • 听起来编译器为std::map::insert选择了错误的重载
  • 自己找到了解决方案。 Thread::Thread(Thread &th) 应该是 Thread::Thread(const Thread &th) 并且 Thread &Thread::operator=(Thread &th) 应该是 Thread &Thread::operator=(const Thread &th)。 handle.swap(th.handle);而不是 handle=move(th.handle);

标签: c++ dictionary insert visual-studio-2017 c2664


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 对不起,我在 P.S. 中添加了缺少的定义
  • 将您的代码缩减到所需的最低限度,然后将其粘贴到 ideone 或其他在线站点。那时帮助你会更容易。正如我在上一条评论中所说,您没有类中 std::thread 所需的移动构造函数/赋值重载。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2013-10-26
  • 1970-01-01
  • 2018-10-07
  • 2016-04-18
相关资源
最近更新 更多