我对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_records
和memory_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;)
答案 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&
的函数时,这意味着什么?