2

我正在尝试在 Visual Studio 2012 中保存一个嵌套的 lambda 函数。

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>显式包含,而如果包含 just ,则定义类本身<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 回答