Подтвердить что ты не робот

Lambda не найден, если он определен в встроенной функции в g++ 4.7

У меня есть следующая функция, определенная в файле заголовка (библиотека - это часть целей только для заголовка):

typedef bool (*FieldComparer)(const std::string&, const std::string&);

inline FieldComparer
GetComparer(const std::string& query, string& separator)
{
    if (query.find('=') != std::string::npos) {
        separator = "=";
        return [](const string& s1, const string& s2) { return s1 == s2; };
    }
    else if (query.find('^') != string::npos) {
        separator = "^";
        return [](const string& s1, const string& s2) { return boost::starts_with(s1, s2); };
    }
    else if (query.find('*') != string::npos) {
        separator = "*";
        return [](const string& s1, const string& s2) { return boost::contains(s1, s2); };
    }
    else if (query.find('!') != string::npos) {
        separator = "!";
        return [](const string& s1, const string& s2) { return s1 != s2; };
    }
    else
        throw std::invalid_argument("Search: could not find operator in query string.");
}


template <class Description>
inline void
Search(Table<Description>& table, const std::string& query,
        std::function<void(const std::string&)> callback, int begin, int limit)
{
    string separator;
    auto comparer = GetComparer(query, separator);

    ... do stuff with comparer ...
}

Я пытаюсь скомпилировать небольшую простую программу, которая включает этот файл, но я получаю undefined ссылки на все lambdas во время ссылки. Когда я говорю просто, есть одна CPP, которая компилируется, но не может связываться. Здесь первая ошибка:

obj/sample.o: In function `DataModel::GetComparer(std::string const&, std::string&)::{lambda(std::string const&, std::string const&)#1}::operator bool (*)(std::string const&, std::string const&)() const':
/home/julien/workspace_dma/src/DataModel/Search.h:23: undefined reference to `DataModel::GetComparer(std::string const&, std::string&)::{lambda(std::string const&, std::string const&)#1}::_FUN(std::string const&, std::string const&)'

Это происходит с тех пор, как я обновился до GCC 4.7.2, он отлично работал в GCC 4.6.2 (версии Ubuntu в случае, если это помогает). Хотя я знаю обходные пути для решения проблемы, мне интересно, что я делаю неправильно или не понимаю правильно. Поскольку lambas находятся внутри встроенной функции, они должны быть определены в любой единицы перевода, которая использует эту функцию.

- EDIT -

Еще одна вещь, которую стоит отметить: функции Search и GetComparer не используются в образце программы.

Search используется в функции-члене Table<Description> (я не могу опубликовать полный класс):

template <class Description>
void Table<Description>::Search(const std::string& query,
        std::function<void(const std::string&)> callback, int begin, int count)
{
    DataModel::Search(*this, query, callback, begin, count);
}

Но ни один из них не вызывается из файла sample.cpp. Этот файл проверяет другие функции Table, которые не связаны друг с другом. Если я прокомментирую вызов в члене, компиляция кода и ссылки. (Мне нужна функция-член, она виртуальная, это часть класса стирания типа выше Table).

4b9b3361