gpt4 book ai didi

c++ - VS 2017错误C2664 map 插入尝试

转载 作者:行者123 更新时间:2023-11-28 04:38:02 24 4
gpt4 key购买 nike

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

最佳答案

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

No two std::thread objects may represent the same thread of execution; std::thread is not CopyConstructible or CopyAssignable, although it is MoveConstructible and MoveAssignable.

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

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

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

关于c++ - VS 2017错误C2664 map 插入尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50871056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com