complex<double> を complex<float> にコピーしようとしたら、VC++6 でコンパイルエラーになってしまった。次のコードで「コンパイルエラーになる」と書いた行がコンパイルできないのだ。コードが単純であるがゆえに、手のほどこしようが無い。
#include <vector> #include <complex> using namespace std; int main() { complex<double> cmpdV; // 要素が double complex<float > cmpfV; // 要素が float cmpdV = cmpfV; // float から double へのコピー、これは OK cmpfV = cmpdV; // double から float へのコピー、コンパイルエラーになる return 0; }
ちなみに g++ や BorlandC++5.5 では、正常にコンパイル可能だ。
VC++6 は、全体としては悪くないけれど、テンプレートに関しては、ちょっと脆弱だ。しかし VC も .NET 以降は、こんなことは無い。テンプレートを使うなら、できれば、新しいコンパイラを使えということだ。
VC のもっと古い版(思い起こせば、多分サービスパックを当てる前の VC++6)では、complex を vector に入れることすらできなかった記憶がある。これに比較すれば、まだましかもしれない。
本当は、次のようなことをしたかったのだ。
#include <vector> #include <complex> #include <algorithm> using namespace std; int main() { vector<complex<double> > veccmpdV; // 要素が double vector<complex<float > > veccmpfV; // 要素が float copy(veccmpdV.begin(), veccmpdV.end(), veccmpfV.begin()); return 0; }
これも、VC++6 はダメで、BorlandC++5.5 では OK である。まっ、抵抗しても無駄だ。
注 : 旦那、上記は、vector のサイズなどを無視したコードなので、このまま、まねをしてはいけませんゼ。
セナ : このページ、なんか、キャラ違うんですけど。
店主 : いいのいいの。エッセーだから。
セナ : えっ、これって、エッセーなの。知らなかった。