WindowsマシンでEclipse 4.2とCDT、およびMinGWツールチェーンを使用しています(ただし、問題はこの特定の構成とは何の関係もないと感じています)。G++ コンパイラは 4.7 です
次のコードを使用して、c++ 11 の機能を試しています。
#include <iostream>
#include <iomanip>
#include <memory>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
int main( int argc, char* argv[] )
{
vector<int> v { 1, 2, 3, 4, 5, 6, 7 };
int x {5};
auto mark = remove_if( v.begin(), v.end(), [x](int n) { return n<x; } );
v.erase( mark, v.end() );
for( int x : v ) { cout << x << ", "; }
cout << endl;
}
すべてが非常に単純明快で慣用的な C++11 です。コードは、コマンド ライン (g++ -std=c++11 hello.cpp) で問題なくコンパイルされます。
このコードをコンパイルするために、Eclipse で C++11 をサポートするようにコンパイラを設定しました。
- プロパティ -> C/C++ ビルド -> 設定 -> その他 -> その他のフラグ:
-std=c++11 を追加しています - プロパティ -> C/C++Build -> 検出オプション -> コンパイラ呼び出し引数:
-std=c++11 を追加
これが、グローバル設定またはプロジェクト プロパティに対して行った唯一の変更です。
最初の質問:なぜ 2 つの場所でフラグを変更する必要があるのですか? 各コンパイラ フラグはいつ使用されますか?
Ctrl-B を押すと、プロジェクトは予想どおり正常にビルドされ、Eclipse 内から実行すると、予想される結果が表示されます (出力: '5, 6, 7,')。
ただし、エディター ビューでは、「remove_if」行と「v.erase」行の両方に赤いエラー マークが表示されます。同様に、[問題] ビューには、これら 2 つの問題があることが示されます。問題の詳細を見ると、次のようになります。
- remove_if 行の場合: '引数が無効です。候補は: #0 remove_if(#0, #0, #1)
- 消去行の場合: '無効な引数候補は次のとおりです: '? 消去(?)、?消去(?,?)'
2 番目の質問: 2 つの異なるビルドがあるようです。1 つは継続ステータス用で、もう 1 つは実際のビルド用です。そうですか?もしそうなら、それらには異なるルールがありますか (コンパイル フラグ、インクルード パスなど)?
3 番目の質問: 問題の詳細に、「インデクサーによって名前解決の問題が見つかりました」というメッセージも表示されます。これが、エラーメッセージが非常に不可解な理由だと思います。これらのメッセージは MinGW g++ コンパイラからのものですか、それとも Eclipse からのものですか? この名前解決とは何ですか? どうすれば修正できますか?
あなたの助けに感謝。
EDIT(@Eugeneへの返信):Eugeneに感謝します。Eclipse でバグをオープンしました。C++11 のせいは部分的だと思います。コードを C++11 のものから削除し、両方のコンパイル スイッチから -std=c++11 フラグを削除しました。それでも、CodAn は remove_if 行で吠えます。
int pred( int n ) { return n < 5; }
int main( int argc, char* argv[] )
{
vector<int> v;
for( int i=0; i<=7; ++i ) {
v.push_back( i );
}
vector<int>::iterator mark = remove_if( v.begin(), v.end(), pred );
v.erase( mark, v.end() );
for( vector<int>::iterator i = v.begin(); i != v.end(); ++i ) {
cout << *i << ", ";
}
cout << endl;
}
コードは (Ctrl-B を使用して) 正常にコンパイルされますが、CodAn は remove_if 行が気に入らず、次のように述べています: Invalid Arguments, Candidates are '#0 remove_if(#0,#0,#1)' . これは非常に難解なメッセージです - フォーマット文字列の引数を置換するのに失敗しているようです ('iterator' の場合は #0、'predicate' の場合は #1)。バグを更新します。
興味深いことに、'vector' の代わりに 'list' を使用すると、エラーが解消されます。
しかし、私の質問に関しては、CodAn がどのように機能するかについて興味があります。g++ (カスタマイズされたフラグ セットを使用)、または別の外部ツール (lint?) を使用しますか、それとも Java で内部的に実行しますか? ツールがある場合、そのコマンド ライン引数とその出力を取得するにはどうすればよいですか?