如何从重载的下标 [] 运算符返回 std::unique_ptr&?
How to return std::unique_ptr& from overloaded Subscripting [] Operator?
我有一个阶级世界,该阶级世界具有一个独特的指针,可以进行类瓷砖。World具有返回对向量持有的unique_ptr的引用。
#include <memory>
#include <vector>
#include "Tile.h"
class World
{
public:
std::unique_ptr<Tile>& get(unsigned int i) { return Vector[i]; }
private:
std::vector<std::unique_ptr<Tile>> Vector;
}
我想用超载运算符替换GET功能:
std::unique_ptr<Tile>& operator[](unsigned int i) { return Vector[i]; }
但是,当我调用世界[i]时,我会遇到以下错误:
error C2280: 'std::unique_ptr<Tile,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function with[_Ty=Tile]
我在做什么错?
问题不在您发布的摘要中。取而代之的是,将operator[]
的返回值与变量绑定的方法很重要。此代码将失败,
World worldInstance;
// fill the Vector in worldInstance with elements...
auto element = worldInstance[0];
试图复制std::unique_ptr<Tile>
对象。std::unique_ptr
是一种仅移动类型,因此编译器抱怨已删除的成员函数(复制构造函数)。取而代之的是捕获返回值作为参考,
auto& element = worldInstance[0];
或直接检索
对Pointee的引用Tile& element = *worldInstance[0];
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 为什么 std::unique 不调用 std::sort?
- 我对 std::unique(算法)C++有问题
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 为什么 [std::unique] 不能应用于 [std::multiset]?
- 使用 std::unique 和 vector.erase 删除除最后一次出现的重复元素之外的所有元素
- 是否可以在 std::unique<T[ ]> 上应用 std::sort?
- std::unique 是否有大小限制
- 从 std::unique 返回的迭代器的用法
- 使 std::unique<T> 与 std::unique<const T, CustomDeleterType 兼容>
- Std::list.unique()应该使迭代器无效
- 无法使用初始化器列表构造 vector<std::unique<...>>
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃
- 我能保证std::unique将保留第一个元素吗?
- 在 std::vector<std::unordered_set上使用 std::unique(<T>>