У меня есть следующая функция, определенная в заголовочном файле (библиотека, целью которой является только заголовок):
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 ...
}
Я пытаюсь скомпилировать небольшую простую программу, которая включает этот файл, но я получаю неопределенные ссылки на все лямбды во время ссылки. Когда я говорю просто, есть один 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 на случай, если это поможет). Хотя я знаю обходные пути для решения проблемы, мне интересно, что я делаю неправильно или неправильно понимаю. Поскольку лямбы находятся внутри встроенной функции, они должны быть определены в любой единице перевода, которая использует эту функцию.
— РЕДАКТИРОВАТЬ —
Стоит отметить еще одну вещь: 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
).
сообщение об ошибке был подан в команду GCC, и один из разработчиков подтвердил проблему с багажником.
В то же время, как указал LucDanton в чате, объявив функцию static
решит проблему.
Других решений пока нет …