冲突:std::set和NTL::vec_ZZ

3

我正在尝试使用std::set来处理NTL-Library定义的任意长度整数向量,但是出现了问题。然而,对于该库定义的ZZ整数,它完全可以正常工作:

#include <NTL/ZZ.h>
#include <NTL/vec_ZZ.h>
#include <set>

NTL_CLIENT

int main(void){


    std::set<ZZ> foo;
    foo.insert(to_ZZ(1)); //works without problems

    std::set<vec_ZZ> vectorFoo;
    vec_ZZ vec;
    vectorFoo.insert(vec);  //causes compiler to crash

    return 0;
}

有人知道为什么第一个插入有效,第二个则无效吗?

标准库中的容器通常有一个要求,即它们的元素必须可复制构造和可分配。我不确定您使用的库是否也是如此,但似乎第二个用法并没有遵守这个规则。 - Alok Save
啊,好的,可能是这样。我可以使用vec_ZZ与列表或向量一起使用,但不能与集合一起使用... - john_leo
编译器崩溃的原因是什么?有错误信息吗?我想vec_ZZ需要定义一个比较运算符。 - Peter Wood
是的,错误信息是 /usr/include/c++/4.4/bits/stl_function.h:230: error: no match for ‘operator<’ in ‘__x < __y’。所以我需要告诉 set 如何比较两个向量?我该怎么做? - john_leo
1个回答

2

std::set<T> 按照 std::less<T> 进行排序,默认为 bool operator<(T,T)ZZ 定义了一个适当的 operator<(它们是有序的),但是 vec_ZZ 没有定义。事实上,大多数 NTL 类都没有定义,甚至包括 ZZ_p。因此,std::set<ZZ_p> 同样无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接