Конфликт std::set и NTL::vec_ZZ
Я пытаюсь использовать std::set для целочисленных векторов произвольной длины, определенных из библиотеки NTL, и по какой-то причине это не работает. Он прекрасно работает с целыми числами 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;
}
Кто-нибудь знает, почему первая вставка работает, а вторая нет?
1 ответ
Решение
std::set<T>
заказано std::less<T>
, который по умолчанию bool operator<(T,T)
, ZZ
действительно определяет правильное operator<
(они заказаны) но vec_ZZ
не делает. На самом деле, большинство классов NTL этого не делают, даже ZZ_p
, Следовательно std::set<ZZ_p>
в равной степени недействительным.