2

Visual Studio 2012 でネストされたラムダ関数を保存しようとしています。

class Wrap
{
public:
  typedef function<void(Wrap*)> Method;
  Method method;
  std::map<string, Wrap> methods;
};

Wrap x;
x.method = [](Wrap *arg) {
    Wrap::Method t = [](Wrap*) {};
    arg->methods["child"].method = t;
};

このエラーが発生します:

エラー C2678: バイナリ'<': 型の左側のオペランドを取る演算子が見つかりませんconst std::string(または、受け入れ可能な変換がありません)

このエラーの表も裏もわかりません。

これを g++ と clang でテストしました。彼らはそれをコンパイルできます。 http://liveworkspace.org/code/4kVlUY$72

Visual Studioでコンパイルするにはどうすればよいですか? 回避策はありますか?

4

2 に答える 2

4

問題は、あなたが期待するものとはまったく関係ありません:

#include <string>

それを解決します。比較演算子<string>を明示的に含める必要があるようですが、 を含めるだけでクラス自体が定義されます<map>

于 2013-02-09T14:53:02.160 に答える
1

コードは GCC 4.7.2、Clang 3.2、ICC 13.0.1 で正常にコンパイルされます。

また、LiveWorkSpaceに投稿した例では省略したヘッダーが#includeあれば、VC10 でも問題なくコンパイルされます。<string>

おそらく、stdlibc++ 実装には、他のヘッダーから直接そのヘッダーが含まれていますが#include、MS の C++ 標準ライブラリの実装には当てはまりません。

そのディレクティブを追加してみてください#include。問題は解消されます。

于 2013-02-09T14:52:59.307 に答える