1

皆さん、VC が c++ テンプレート コードをコンパイルするときに、GCC と同じ厳密なコンパイル ルールが必要です。しかし、VC9.0 (Visual Studio 2008) でこれを設定する方法がわかりません。

たとえば、次のコードは GCC では許可されていません。

AutoPtr<RefCounted<Shape>> shape;

">>" はここでは許可されておらず、gcc は ">>" の間に少なくとも 1 つのスペースを追加するように要求しているためです。

AutoPtr< RefCounted<Shape> > shape;

VC はこれをエラーとして扱いません。私の理解では、VC にはテンプレート コードのコンパイルに関するより緩やかな制限があります。

VC に制限を追加して、GCC と同じルールにするにはどうすればよいですか?

4

4 に答える 4

3

私はそれをエラーとは呼びません.C++ 0xではこの制限が解除されているので、慣れるでしょう. さらに重要なことは、Visual Studio は C++03 準拠の大かっこをスペースで区切って受け入れることを完全に受け入れるので、私はそれを使用するだけで、それを忘れることができます。Visual Studio のパーサーが標準で指定されていないという事実を変更する方法はありません。これは、非準拠である最も重要でない方法です。

于 2011-03-30T03:45:30.120 に答える
3

あなたはそうしない。:( MSVC++ は単純にテンプレートを正しく処理しないため、注意が必要です。


あなたの特定の例は実際にはC++0xのエラーではないことに注意してください。したがって、MSVC2010 は実際にそれを受け入れるのが正しいでしょう。(ただし、他の多くの点ではまだ間違っていますが、少し良くなりました。)

「チート」して、gcc コンパイルで C++0x を有効にして許可することもできます。MSVC2008 (または MSVC2010!) がサポートしていない C++0x を誤って使用しないように注意してください。

于 2011-03-30T02:27:32.733 に答える
1

私は、GMan の声明「MSVC++ は単純にテンプレートを正しく処理しない」に同意しません。代わりに、MSVC と GCC の両方が、それぞれ独自の方法でテンプレートを正しく処理していないと言えます :)

コンパイラの仕様に対処するには、いくつかのコンパイル時テスト モジュールのセットを維持する価値があります。また、bjam などの最新のビルド システムは、プロジェクトのコンパイル直後に簡単な単体テストを実行するように構成できます。そのため、gcc ツールセット (および/または Windows 以外のプラットフォーム) を使用して時々プロジェクトをビルドし、すべてが期待どおりに機能することを確認するだけです。

PS。反対票は私のものではありません:)

于 2011-03-30T03:41:55.487 に答える
1

Microsoft 固有の拡張機能を無効にしてみましたか?

于 2011-03-30T03:46:37.290 に答える