C++マニアック

complex がコピーできない

ページの末尾へ トップページへ

サイト内検索
カスタム検索

節電しましょう。電力の使用状況グラフ(東電)

complex がコピーできない

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 のサイズなどを無視したコードなので、このまま、まねをしてはいけませんゼ。

セナ : このページ、なんか、キャラ違うんですけど。
店主 : いいのいいの。エッセーだから。
セナ : えっ、これって、エッセーなの。知らなかった。