私はVC 2010を使用しており、各クラスインスタンスのコンストラクターにランダムな定義を配置し、必要に応じてそこから呼び出すことにより、特定の関数のオーバーヘッドと重複コードを低く抑えようとしています。私が今持っているものは、単純化すると次のとおりです。
#include <random>
#include <Windows.h>
mt19937 eng(GetTickCount());
class Cycles {
int line;
normal_distribution<> rand_norm;
variate_generator<mt19937&,normal_distribution<>> r_norm;
public:
Cycles()
: rand_norm(0.85,0.05),
r_norm(eng,rand_norm) {
line=0;
}
}
残念ながら、それは機能せず、次のエラーが発生します。
\vc\include\random(513): エラー C2248: 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator =': クラスで宣言されたプライベート メンバーにアクセスできません 'std::tr1::_Ewrap<_Engine, _Tgt_type>'
\vc\include\random(446) : 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator =' の宣言を参照してください
この診断は、コンパイラによって生成された関数 'std::tr1::variate_generator<_Engine,_Distrib> &std::tr1::variate_generator<_Engine,_Distrib>::operator =(const std::tr1::variate_generator<_Engine,_Distrib) で発生しました。 > &)'
コンストラクターを開く前にこれらを初期化する必要があることは理解しています。そうしないと、デフォルトのコンストラクターがないためにエラーが発生しますが、なぜこれが失敗するのかわかりません。私の C++ fu はかなり錆びています。
私が見たすべての例は、ディストリビューターとジェネレーターがそれを呼び出す関数でグローバルまたはローカルに初期化されていることを示しています。これは、タイトなループで呼び出される r_norm を使用するいくつかのメンバー関数があるため、ばかげているように思えます。においテストにひどく失敗します。私が欠けているものを誰も知りませんか?