2016-07-29 12 views
0

gccで次のコードをコンパイルして実行すると、うまく動作します。私はコンパイルしてVCでこのコードの平和を実行する場合は++、それは失敗し、ポップアップは言う: 「式:ベクターは、互換性のないイテレータ」gccでコンパイルされたC++は有効であり、VC++では無効です。

int main() { 

    vector<int> v = { 1,2,3,4 }; 
    for(auto it = v.begin(); it != v.end();) 
    { 
     if(*it% 2 == 0) 
     { 
      v.erase(it); 
     }else 
     { 
      ++it; 
     } 
    } 

    return 0; 
} 
+0

技術的には、Visual StudioまたはVisual C++ではエラー(またはデバッグアサーション)が発生しません。デバッグランタイムライブラリによって生成されます。 – IInspectable

+0

['it'は無効になります](http://www.cplusplus.com/reference/vector/vector/erase/)(「反復子の有効性」を参照) – ForceBru

+0

エラーとは無関係に、' std: :remove_if'このようなループではなく? –

答えて

6

はVC++は正しいです:あなたはeraseを呼び出すときitが無効化されます。おそらくit = v.erase(it)を使用してください。これはgccの下での偶然によって動作します。

関連する問題