1

これは、この質問からのフォローアップの質問です。次のように「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

5のルール(3 + Move)が尊重されていないことを~Sineリリースすると思います。LinComb

そのように実装する(または禁止する=delete)必要があります:

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