我正在编写一个带有几个文件的程序,让我们假设所有包含都可以。这是缩短的代码。 ZZ.hpp:
class ZZ
{
public:
ZZ(ZZ const & a) { mpz_init_set(data, a.data); }
ZZ(int a = 0) { mpz_init_set_si(data, a); }
.
.
.
ZZmodN.hpp:
template <unsigned ID>
class ZZmodN
{
public:
ZZmodN() = default;
ZZmodN(ZZmodN const &) = default;
template <typename T>
ZZmodN(T const & a) : value(a) { value %= modulus; }
.
.
.
private:
ZZ value;
static ZZ modulus;
};
template <unsigned ID>
ZZ ZZmodN<ID>::modulus(19);
.
.
.
Polynomial.h:
class Polynomial{
public:
std::vector<ZZmodN<0> > co;
Polynomial(){};
Polynomial(ZZmodN<0> a){
co.push_back(a);
}
.
.
最后是Field.h:
#include "Polynomial.h"
class Field{
public:
static Polynomial f;
Polynomial poly;
Field(){}
.
.
};
Polynomial Field::f = Polynomial(1);
问题是:当我调用last( * )行时,我收到浮点异常,因为当模数%=模数时'模数'= 0;叫做。为什么是0而不是19?我检查了,并且调用了带有19的ZZ构造函数。 请帮忙。
答案 0 :(得分:6)
您遇到的问题是static initialization order fiasco。在您的情况下,链接器决定在初始化Field::f
之前初始化ZZmodN<0>::modulus
。
答案 1 :(得分:1)
如果你使modulus
成为一个函数,就像下面的代码一样,你的问题就会消失。 <{1}}必须在_m
返回之前初始化。
modulus()