C ++ лямбда-выражение справки - PullRequest
1 голос
/ 05 августа 2011

Я немного новичок в 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;
    });
}

, где alloc_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) [с _IIter = std :: _ List_iterator, _Funct = memory_leak_report () ::]

ошибка: не соответствует вызову (memory_leak_report)(): :) (memory_allocation_record &)

примечание: кандидаты: void (*) (const memory_leak_report () :: memory_leak_report &)

1 Ответ

2 голосов
/ 05 августа 2011

Во-первых, в C ++ вам не нужно (и это обычно считается плохим стилем) ставить struct перед использованием структуры.Просто const memory_leak_report& подойдет.

Во-вторых, вы говорите нам, как определяется структура memory_allocation_record, но лямбда принимает в качестве параметра memory_leak_report, который, насколько я вижу, это функция .

это ваша ошибка?Предполагалось, что вместо лямбды будет взято 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&)

Теперь, потому что это лямбда, типнемного сложновато, но, в конечном счете, речь идет о вызове функции, поэтому последние скобки описывают параметр.Другими словами, он пытается вызвать функцию с параметром 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&?

...