【发布时间】:2026-01-17 18:40:01
【问题描述】:
您好,我是 C++ 新手,在尝试对唯一指针向量进行排序时遇到了困难。我有一个基类和派生类(这里是一个)。
class Item
{
public:
virtual void printData() {}
};
class IntItem : public Item
{
public:
int data;
IntItem(int data)
{
this->data = data;
}
void printData()
{
std::cout << data;
}
};
struct intItemCompare
{
inline bool operator()(std::unique_ptr<IntItem>& a, std::unique_ptr<IntItem>& b)
{
return a->data < b->data;
}
};
我有std::vector<std::unique_ptr<Item>> data;,其中存储了派生类对象的唯一指针 - 不是 Item 类(例如 IntItem 对象)
数据像这样被推送到向量:
std::unique_ptr<IntItem> newItem= std::make_unique<IntItem>(10); // 10 is just random number
data.push_back(std::move(newItem));
我想用std::sort(data.begin(),data.end(),intItemCompare());对其进行排序
其中一个错误是no known conversion for argument 1 from ‘std::unique_ptr<Item>’ to ‘std::unique_ptr<IntItem>&’ 41 | inline bool operator()(std::unique_ptr<IntItem>& a, std::unique_ptr<IntItem>& b)
如果需要,我可以添加整个错误消息。
我应该如何实现它?我做错了吗?感谢您的帮助。
【问题讨论】:
-
您应该显示
data的声明。请阅读minimal reproducible example。 -
A
std::unique_ptr<Item>与std::unique_ptr<IntItem>的类型不同,即使IntItem派生自Item。 -
如果你有一个
Items 而不是intItems 的容器,对它们进行排序是否有意义?如果该容器中有stringItems 怎么办?你如何对一个整数排序一个字符串? -
@FrançoisAndrieux 你所说的声明是什么意思?项目如何推送到数据的信息还不够吗?
-
@Riomare
std::sort不知道向量的元素指向什么样的Item,它只能假设那些指向的对象是从Item派生的。它要求您的比较器接受指向Item的指针,而不是指向某些派生类型的指针。
标签: c++ algorithm polymorphism unique-ptr