1

这是this question的后续问题。当我使用 'make_LSMDP2(...)' 方法实例化如下

        auto  A = make_LSMDP2(N,q,F,BM,Dr,Sine{b,c*Time},X0,R,M,T,HC_Base{T->ReturnTerm(),X0->size , length, prewidth},HC_Base{T->ReturnTerm(),X0->size , length, prewidth});

“BasisY”、“BasisZ”和“Term”类型对象的构造函数工作正常:我在每个构造函数中运行测试以确保它们正常工作。但是,当我尝试使用实例化对象时,其行为就好像它们是用随机参数实例化的,所以显然一切都是一团糟。

有关如何实现上述方法的简单版本,请参阅此内容。

有谁知道为什么会这样?我唯一能说的可能是问题是我在与我定义模板方法的头文件不同的头文件中定义了类型“Sine”和“HC_Base”。但是,标头包含在构造模板的文件中,所以我不明白这是怎么回事。

事实上,我试图通过在另一个项目中开发一个简单的“LSMDP2”模板示例来隔离问题,以查看我构建类的方式是否存在根本性错误。在那种情况下一切正常。参数类更简单,但使用了所有相同的数据类型(只是为了确保我正确使用了库)以及非平凡的构造函数。我能说的唯一区别是,在这种情况下,参数类和模板方法是在同一个标​​头中定义的。

如果您需要任何进一步的信息或编译器详细信息,请告诉我!

编辑:根据要求,一个不起作用的代码的简化示例:使用构造函数

template<class BasisY, class BasisZ, class Term > LSMDP2<BasisY,BasisZ,Term>::LSMDP2(Term && P,  BasisY && BY1, BasisZ && BZ1) :  
    Phi(std::forward<Term>(P)) , BY(std::forward<BasisY>(BY1)), BZ(std::forward<BasisZ>(BZ1)){
BY.func_test();
}

使用实例化一个对象

        auto A  = make2_LSMDP2(Sine{b,c*Time},HC_Base{T->ReturnTerm(),X0->size , length, prewidth},HC_Base{T->ReturnTerm(),X0->size , length, prewidth});

其中 'make2_LSMDP2(...)' 只是调用更简单的构造函数。'Sine' 和 HC_Base 的构造函数如下:

Sine(gsl_vector * LC,double con){
    cout << "Vector dimension = " << LC->size << endl;
    LinComb = gsl_vector_alloc(LC->size);
    gsl_vector_memcpy(LinComb,LC);
    c=con;
}



HC_Base(double T /*Terminal time*/,  size_t d/*dimension*/, double width/*cube width*/, double bound/*prewidth*/) : base_f(T), CubeWidth(width),dimension(d),    pre_width (bound)
{
    func_test();
}

'base_f' 只是提供一些默认行为的父类包装器。在 HC_Base 的构造函数中,调用了一个测试来测试实例化对象的性能,并且运行良好。在同一对象的 LSMDP2 构造函数中调用相同的测试,显示完全不同的行为!事实上,我只在 LSMDP2 的构造函数中展示了对 HC_Base 的测试,但我可以使用 Sine 执行类似的测试,但会失败。

4

1 回答 1

1

我认为~Sinerelease LinComb,即 5 (3+move) 的规则不被遵守。

你应该这样实施(或禁止=delete):

  • Sine(const Sine&)
  • Sine& operator=(const Sine&)
  • Sine(Sine&&);
  • Sine& operator=(Sine&&)
于 2013-10-07T07:46:18.187 回答