gpt4 book ai didi

c++ - 如何在队列中存储 unique_ptr

转载 作者:行者123 更新时间:2023-11-30 01:50:13 41 4
gpt4 key购买 nike

我有这样一个代码,我尝试在其中存储 std::unique_ptr<T>std::queue但它不会编译

#include "stdafx.h"
#include <windows.h>
#include <memory>
#include <string>
#include <iostream>
#include <deque>

using namespace std;

class Foo {
std::string _s;
public:
Foo(const std::string &s)
: _s(s)
{
cout << "Foo - ctor";
}

~Foo() {
cout << "Foo - dtor";
}

void Say(const string &s) {
cout << "I am " << _s << " and addtionaly " << s;
}
};

typedef std::pair<long, std::unique_ptr<Foo>> MyPairType;
typedef std::deque<MyPairType> MyQueueType;

void Func(const std::unique_ptr<Foo> &pf) {
pf->Say("Func");
}

void AddToQueue(MyQueueType &q, std::unique_ptr<Foo> &pF){
MyPairType p;
::GetSystemTimeAsFileTime((FILETIME*)&p.first);
p.second = pF; // **Fails here**
q.push_back(p);
}

int _tmain(int argc, _TCHAR* argv[])
{
std::unique_ptr<Foo> pF(new Foo("Aliosa"));

Func(pF);

return 0;
}

它说我不能在 AddToQueue 方法中赋值。我知道这可能与 boost::shared_ptr 有关但我们正试图摆脱 boost依赖因此有这样的问题。

知道如何实现所需的行为吗?谢谢

最佳答案

这一行:

p.second = pF;

正在制作唯一指针的拷贝(即它不再是唯一的)。您可以执行以下操作:

MyPairType p;
::GetSystemTimeAsFileTime((FILETIME*)&p.first);
p.second.swap(pF);
q.push_back(p);

但请记住,pF 将不再引用指针地址。如果您想要对同一地址的更多引用,您需要使用 std::shared_ptr

关于c++ - 如何在队列中存储 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27793040/

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