c++ c++11 gcc4.7

c++ - Lambda no encontrado cuando se define en una función en línea en G++ 4.7



c++11 gcc4.7 (1)

Tengo la siguiente función definida en un archivo de cabecera (la biblioteca de la que forma parte pretende ser solo encabezado):

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 ... }

Estoy intentando compilar un pequeño programa simple que incluye este archivo, pero obtengo referencias indefinidas a todas las lambdas en el momento del enlace. Cuando digo simple, hay un solo CPP que compila pero no puede vincular. Aquí el primer error:

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&)''

Está sucediendo desde que me actualicé a GCC 4.7.2, solía funcionar bien en GCC 4.6.2 (versiones de Ubuntu en caso de que eso ayude). Si bien conozco soluciones para resolver el problema, me pregunto qué estoy haciendo mal o no entiendo correctamente. Como las lambas están dentro de la función en línea, deberían definirse en cualquier unidad de traducción que use esa función.

- EDITAR -

Una cosa más que vale la pena destacar: la función Search y GetComparer no se utilizan en el programa de ejemplo.

Search se usa en una función miembro de la Table<Description> (No puedo publicar la clase completa):

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); }

Pero ninguno se llama desde el archivo sample.cpp. Ese archivo prueba otras características de Table que no están relacionadas. Si comento la llamada en el miembro, el código compila y enlaces. (Necesito la función de miembro, es virtual, es parte de una clase de borrado de tipo arriba de la Table ).