Проблема приведения лямбда в std :: function

0

У меня возникают проблемы с MiniGW при попытке создать API. Это отлично работает в MSVC11 (компилятор Visual Studio 2012 C++). Мой компилятор (я считаю) настроен правильно QMAKE_CXXFLAGS += -std=C++0x, после всего, что у меня есть сообщение об ошибке лямбда.

Еще одно объяснение:

typedef std::function<bool(Item)> WHERE;//I was attempting to provide an explicit cast, 'auto' works fine in MSVS

Group where(WHERE func);//A simple "foreach boolean" search

Используя above->

Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");};

результаты:

tst_groupstest.cpp: 257: error: преобразование из 'GroupsTest :: groups() :: __ lambda1' в нескалярный тип 'Groups :: WHERE {aka std :: function}' запрошенные группы :: WHERE where = [] (Item & x) → bool {return x.has("NEW");};

Я надеюсь, что это нечто очевидное, я просто не могу его найти. Я планирую поддерживать Linux и Mac в будущем с помощью этого проекта, поэтому я хотел бы рассказать об этом раньше, чем позже.

Здесь мой текущий обходной путь, и я предпочел бы держаться подальше от этого, если это вообще возможно (в конце концов, причина, по которой я разработал его API с лямбдами в виду, заключался в том, чтобы иметь четкие кодовые блоки, которые очевидны).

Этот раздел компилируется (он не использует лямбда)

struct lambdaCueListstdFunc{
    bool operator()(Groups::Item x)
    {
        return x.has("NEW");
    }
};

/**
 * Selects all cues for a particular list
 * @brief getCueList
 * @param list
 * @return a vector of all the cues for this list sorted by number.
 */
std::vector<Groups::Item> CueService::getCueList(std::string list)
{
    std::function<bool(Groups::Item)> where = lambdaCueListstdFunc();
//    auto where = [&list] (Groups::Item & x) ->
//    {
//        return x.get(la::cues::List) == list;
//    };
    std::vector<Groups::Item> result = cues()->where(where).sort(la::cues::NUMBER);
    return result; 

}
Теги:
c++11
lambda
visual-studio-2012
mingw

2 ответа

5
Лучший ответ

Функциональная подпись, которую вы указали для std::function отличается от той, которую вы пытаетесь присвоить ей.

typedef std::function<bool(Item)> WHERE; // <-- Takes argument by value

Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");};
//                           ^^^
// The lambda takes argument by reference

Измените один, чтобы соответствовать другому, в зависимости от того, хотите ли вы передать значение или ссылку.

  • 0
    Спасибо, ты сэкономил мне несколько часов, пытаясь понять это.
0

Это подошло ко мне по другой причине: тип значения, прошедший через лямбда-args, имел член типа std :: unique_ptr и, следовательно, не был скопирован.

Исправить 1: изменить элемент на std :: shared_ptr

Исправить 2: передать по (const) ссылку

Ещё вопросы

Сообщество Overcoder
Наверх
Меню