![](/img/trans.png)
[英]Map insert results in C2664 error in VS 2015, works in VS 2013
[英]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.