模板方法构造函数中的C ++奇怪行为

时间:2013-10-06 11:49:00

标签: c++ templates constructor

这是来自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”类型的对象的构造函数工作正常:我在每个构造函数中运行测试以确保它们正常工作。但是,当我尝试使用实例化对象时,行为就好像它们是用随机参数实例化的,所以显然一切都很乱。

有关如何实施上述方法的简单版本,请参阅this

有谁知道为什么会这样?我唯一能说的可能是问题是我在不同的头文件中将类型'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执行类似的测试,但是会失败。

1 个答案:

答案 0 :(得分:1)

我认为~Sine释放LinComb,规则5(3 +移动)不受尊重。

您应该如此实施(或禁止=delete):

  • Sine(const Sine&)
  • Sine& operator=(const Sine&)
  • Sine(Sine&&);
  • Sine& operator=(Sine&&)