我使用以下代码建立了一种注册表类:
class MyClass
{
public:
int a;
std::string b;
};
class Register
{
public:
std::vector<std::shared_ptr<MyClass>> items;
bool registerItem(std::shared_ptr<MyClass> item)
{
/*
* Check if item exists
*/
auto position = std::find(items.begin(), items.end(), item);
if (position != items.end())
return false;
items.push_back(item);
return true;
}
bool unregisterItem(std::shared_ptr<MyClass> item)
{
auto position = std::find(items.begin(), items.end(), item);
if (position == items.end())
return false;
items.erase(item);
return true;
}
};
int main()
{
std::shared_ptr<MyClass> item1 = new MyClass;
Register registry;
if (!registry.registerItem(item1))
std::cout << "Error registering item1" << std::endl;
else
std::cout << "Success registering item1" << std::endl;
if (!registry.registerItem(item1))
std::cout << "Error unregistering item1" << std::endl;
else
std::cout << "Success unregistering item1" << std::endl;
}
我无法编译此代码,因为items.erase(item)
抱怨error: no matching member function for call to 'erase'
。
为什么我不能删除我添加的对象。从std::shared_ptr
中删除std::vector
的正确方法是什么?
答案 0 :(得分:6)
因为你想在items
(即 position
)中使用迭代器,所以:
items.erase(position);
答案 1 :(得分:2)
有两种声明可用。 From cppreference:
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
您尝试std::vector::erase
项目本身而不是迭代器。使用
items.erase(position);
代替。
答案 2 :(得分:1)
您必须在erase
上致电position
,而不是item
因为擦除用在迭代器上
答案 3 :(得分:0)
你应该传递擦除迭代器而不是值,删除std :: shared_ptr没什么特别之处。你在代码中也有错误输入:你注册了两次而不是在第二次调用中注销它。