過去ログちゃんと読めよ。昨日さんざん話したっていうのに。 A *= B の場合、一行分の作業領域もしくは行列1個分の作業領域とコンストラクタ、swapの呼び出しが必要。 C = A * B の場合、行列一個分の作業領域とコンストラクタ、コピーコンストラクタの呼び出しが必要(RVOが使えなければそれ以上)。 multiply(Matrix& C, const Matrix& A, const Matrix& B) を使った場合、 &C == &A の場合、A *= Bと一緒、 &C == &B の場合、一列分の作業領域もしくは行列1個分の作業領域とコンストラクタ、swapの呼び出しが必要。 &C != &A && &C != &B の場合、領域もコンストラクタもswapもいらない。 三番目のパターンはoperatorでは実現できない。受ける変数のために行列一個分の作業領域とコンストラクタが必要でも、 コピーコンストラクタ分は得する。あと変数を使い回せるという利点もある。
Matrix A = ...; Matrix B = ...; Matrix C = ...; Matrix D = ...; Matrix E; //E = A * B * C * D; multiply(E, A, B); multiply(A, E, C); multiply(E, A, D);
T x = initial_value; try { x = new_value; } catch( ... ) { } // x はまだ生きている。 // ここで x の値は initial_value か new_value か、どちらかであると言えなければ、 // 以降、 x へアクセスしたときの動作が把握できない。
>>346 struct afo { virtual SetOne() = 0; }; struct sine { virtual SetTwo() = 0; }; class black { /* ry */ }; class c { /* ry */ }; class A : public afo, public sine { black b; c dakko; /* ry */ }; class B : public afo { black b; /* ry */ }; class C : public sine { c dakko; /* ry */ };
template <class Container, class BasicOp> void MakeOperationStrong( Container& c, const BasicOp& op ) { Container tmp(c); // Copy c op(tmp); // Work on the copy c.swap(tmp); // Cannot fail }
VS2002にVCToolKit2003をいれてstlport4.6.2でboostコンパイルできた人いる? error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl swprintf(unsigned short *,unsigned int,unsigned short const *,...)"