gpt4 book ai didi

c++ - std::unique_ptr 和模板:为什么这段代码不能编译?

转载 作者:行者123 更新时间:2023-11-30 01:46:54 27 4
gpt4 key购买 nike

我正在为游戏开发模板化组件系统。它将项目保存在一个 vector 中并有两个部分特化:一个用于 POD 类型,另一个使用 std::unique_ptr。 std::unique_ptr vector 的模板化特化无法编译,但在非模板代码中使用 std::unique_ptr vector 可以正常工作。我一直在寻找这个问题的解决方案,但不幸的是,我对 C++11/C++14 的了解还不够完善;我做错了什么?

最小示例(剥离到问题区域):

#include <vector>
#include <memory>

template<typename T>
class component
{
public:
class handle
{
friend class component;
protected:
std::size_t inner;
};

component<T>::handle add(const T& t)
{
items.push_back(t);
handle h;
h.inner = items.size() - 1;
return h;
}

protected:
std::vector<T> items;
};


template<typename T>
class component<std::unique_ptr<T>>
{
public:
class handle
{
friend class component;
protected:
std::size_t inner;
};

component<std::unique_ptr<T>>::handle add(const std::unique_ptr<T>& t)
{
items.push_back(std::move(t));
handle h;
h.inner = items.size() - 1;
return h;
}

protected:
std::vector<std::unique_ptr<T>> items;
};

这是测试代码

int main()
{
// This works fine.
component<int> pod_component;
pod_component.add(5);

// This works, too!
std::vector<std::unique_ptr<int>> pointer_vector;
pointer_vector.push_back(std::make_unique<int>(5));

component<std::unique_ptr<int>> pointer_component;
// Why doesn't this compile?
pointer_component.add(std::make_unique<int>(5));

return 0;
}

这是 gcc (4.9.3 Gentoo) 的错误输出:

 error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

我希望比我更擅长 C++ 的人可以帮助我和 future 的读者理解这个棘手的问题。

最佳答案

问题出在这里:

component<std::unique_ptr<T>>::handle add(const std::unique_ptr<T>& t)   
{ // |
items.push_back(std::move(t));// <------+
// ...
应用于 const 左值的

std::move 返回 const 右值引用。因此,它受 push_back(const value_type&) 重载而不是 push_back(value_type&&) 的约束,这意味着它试图复制 unique_ptr 作为参数传递。

正确的声明应该如下所示:

component<std::unique_ptr<T>>::handle add(std::unique_ptr<T>&& t)
// ~^^~

关于c++ - std::unique_ptr 和模板:为什么这段代码不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32466248/

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