【发布时间】:2013-02-09 03:27:46
【问题描述】:
当我尝试编译以下代码时:
#include <iostream>
#include <set>
#include <vector>
using namespace std;
template <class T, class S>
class Property
{
public:
pair<T,S> p;
Property(T t, S s) { p = make_pair(t,s);}
};
int main()
{
set< Property<string, string> > properties;
Property<string, string> name("name", "Andy");
properties.insert(name);
}
我得到编译错误。 但是,当我用向量替换 set 并因此使用 push_back 函数而不是 insert 函数时,一切正常。谁能解释我做错了什么? 感谢您的建议。
【问题讨论】:
-
如果你不关心排序,你可能想试试
std::unordered_set这在我的脑海里。 -
@chris 使用
std::unordered_set可能需要更多的工作,因为您必须提供哈希和相等运算符。 -
@Rapptz,没错,虽然在我看来,这里的排序并不突出。
-
不定义排序(
operator <(const Property&),标准std::set无法确定元素的身份(顺便说一句,这是使用(!(left < right) && !(right < left))完成的,因此请确保您的顺序一致) .std::pair<>模板已经定义了最常用的顺序比较器,所以除非您有特定的理由不,否则您可以通过简单地将Property作为正式定义来轻松解决您的问题而是只使用typedef std::pair<string,string> Property;我猜,但是,您需要不区分大小写的标签比较。