std::pair 和标准集合中的自定义 unique_ptr
Custom unique_ptr inside std::pair and standard collections
我正在尝试在 std::pair
集合中使用自定义 unique_ptr
。下面是我到目前为止的内容,但是如果我取消注释第一个注释掉的行,那么我会得到一个错误:
No matching constructor for initialization of PairedThing1
所以我还没有将这些对放入容器中(第二个注释掉的行)。
我已经在评论中注明了我的意图。我正在寻找正确的 C++ 咒语。
template<class T> using UniqueThingRef = typename std::unique_ptr<std::remove_pointer_t<T>, void(*)(T)>;
typedef struct Thing1* Thing1Ref;
using PairedThing1 = std::pair<UniqueThingRef<Thing1Ref>, int>;
Thing1Ref MakeThing1()
{
return (Thing1Ref)(new char()); //fake this for now
}
void KillThing1( Thing1Ref t)
{
delete (char*)t; //fake this for now
}
static void trythings()
{
UniqueThingRef<Thing1Ref> uni(MakeThing1(), KillThing1);
// PairedThing1 duo(uni, 42); //uni should drop ref and hand to duo
std::vector< PairedThing1> someThings;
// someThings.insert( someThings.begin(), duo); //duo should drop ref and hand to someThings
}
您不能复制 std::unique_ptr
(因此得名)。你必须移动它。
PairedThing1 duo(uni, 42);
应该是
PairedThing1 duo(std::move(uni), 42);
同样,第二段注释的代码应该是
someThings.insert(someThings.begin(), std::move(duo));
我正在尝试在 std::pair
集合中使用自定义 unique_ptr
。下面是我到目前为止的内容,但是如果我取消注释第一个注释掉的行,那么我会得到一个错误:
No matching constructor for initialization of PairedThing1
所以我还没有将这些对放入容器中(第二个注释掉的行)。
我已经在评论中注明了我的意图。我正在寻找正确的 C++ 咒语。
template<class T> using UniqueThingRef = typename std::unique_ptr<std::remove_pointer_t<T>, void(*)(T)>;
typedef struct Thing1* Thing1Ref;
using PairedThing1 = std::pair<UniqueThingRef<Thing1Ref>, int>;
Thing1Ref MakeThing1()
{
return (Thing1Ref)(new char()); //fake this for now
}
void KillThing1( Thing1Ref t)
{
delete (char*)t; //fake this for now
}
static void trythings()
{
UniqueThingRef<Thing1Ref> uni(MakeThing1(), KillThing1);
// PairedThing1 duo(uni, 42); //uni should drop ref and hand to duo
std::vector< PairedThing1> someThings;
// someThings.insert( someThings.begin(), duo); //duo should drop ref and hand to someThings
}
您不能复制 std::unique_ptr
(因此得名)。你必须移动它。
PairedThing1 duo(uni, 42);
应该是
PairedThing1 duo(std::move(uni), 42);
同样,第二段注释的代码应该是
someThings.insert(someThings.begin(), std::move(duo));