c ++ lambda表达式帮助

时间:2011-08-05 11:20:08

标签: c++ lambda g++

我对c ++ 0x有点新手,有人可以向我解释为什么以下编译失败:

void memory_leak_report()
{
    std::cout.flags(std::ios::showbase);
    std::for_each(allocation_records.begin(), allocation_records.end(),
                  [] (const struct memory_leak_report& rec) {
                      std::cout << "memory leak at: " << rec.file << ": line " << rec.line
                                << std::hex << ", address: " << rec.address << std::dec
                                << ", size:" << rec.size << std::endl;
    });
}

其中allocation_records定义为:std::list<struct memory_allocation_record> allocation_recordsmemory_allocation_record是一个简单的C风格数据结构。

struct memory_allocation_record {
    const char *func;
    const char *file;
    unsigned int line;
    unsigned int size;
    unsigned long address;
};

我尝试用以下方法编译它:g ++ -Wall -g -o alloc main.cpp -std = c ++ 0x

我得到的错误是: 在函数ג_Funct std :: for_each(_IIter,_IIter,_Funct)[with _IIter = std :: _ List_iterator,_Funct = memory_leak_report()::]

错误:无法匹配(memory_leak_report()::)(memory_allocation_record&amp;)

注意:候选人是:void(*)(const memory_leak_report():: memory_leak_report&amp;)

1 个答案:

答案 0 :(得分:2)

首先,在C ++中,您不需要(并且通常被认为是错误的样式)将struct置于结构的使用之前。只需const memory_leak_report&即可。

其次,你告诉我们结构memory_allocation_record是如何定义的,但是lambda以memory_leak_report为参数,据我所知,是一个函数

是你的错误? lambda应该改为memory_allocation_record吗?

当然,这将我们带到最后一点。如果您收到错误,您认为告诉我们错误是什么并不重要吗?否则,我们必须猜测我们认为可能是您代码中的问题。

修改
好吧,正如我怀疑的那样,这似乎是个问题。我可以推荐实际阅读编译器的错误。这就是他们在那里的原因。 ;)

取错误的第一行:

/usr/include/c++/4.5/bits/stl_algo.h:4185:2: error: no match for call to ג(memory_leak_report()::<lambda(const memory_leak_report()::memory_leak_report&)>) (memory_allocation_record&)

去除不相关的位:

no match for call to <somethingwithlambdas> (memory_allocation_record&)

现在,因为这是一个lambda,类型有点毛茸茸,但最终,它讨论的是函数调用,所以最后的括号描述了参数。换句话说,它尝试调用以memory_allocation_record&作为参数的函数,但无法找到匹配的函数。

相反,它找到了第二行中描述的候选人:

candidates are: void (*)(const memory_leak_report()::memory_leak_report&) <conversion>

因此,实际找到的候选人const memory_leak_report&作为参数。

现在你只需要比较两者。当编译器试图将memory_allocation_record&传递给期望const memory_leak_report&的函数时,这意味着什么?