2

私はこの例をBjarneStroustrup(C ++)の(オランダ語に翻訳された)本で試しています:

#include <vector>
#include <list>
#include "complex.h"

complex ac[200];
std::vector<complex> vc;
std::list<complex> l;

template<class In, class Out> void Copy(In from, In too_far, Out to) {
    while(from != too_far) { 
            *to = *from;
            ++to;
            ++from;
            }
}

void g(std::vector<complex>& vc , std::list<complex>& lc) {
    Copy(&ac[0], &ac[200], lc.begin());           // generates debug error
    Copy(lc.begin(), lc.end(), vc.begin());       // also generates debug error
}

void f() {
    ac[0] = complex(10,20);
    g(vc, l);
}

int main () {
    f();
}

**コンパイルとリンクは成功します(0エラー/警告)**

しかし、実行時に次のエラーが発生します。

デバッグアサーションに失敗しました!

プログラム:exeへのパス

ファイル:\ program files \ ms vs studio 10.0 \ vc \ include \ list

ライン:207

式:リストイテレータは参照解除できません

プログラムがアサーションの失敗を引き起こす可能性がある方法については、アサーションに関するVisualC++のドキュメントを参照してください。(再試行を押してアプリケーションをデバッグします)

4

1 に答える 1

1

次の両方が間違っています:

Copy(&ac[0], &ac[200], lc.begin());           // generates debug error
Copy(lc.begin(), lc.end(), vc.begin());       // also generates debug error

関数Copy()は、3番目の引数として指定されたイテレータから始まる要素を上書きします。したがって、宛先範囲は有効であり、コピーされるすべての要素を収容するのに十分な大きさである必要があります。どちらlcvcこれを満たさないため、コードの動作は未定義です。

コードを修正する1つの方法は、を使用することstd::back_inserterです。

于 2012-12-15T14:56:08.897 に答える