在G ++ 4.7中的内联函数中定义时未找到Lambda

J.N*_*.N. 31 c++ c++11 gcc4.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 ...
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编译一个包含此文件的小型简单程序,但我在链接时获得了对所有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&)'
Run Code Online (Sandbox Code Playgroud)

自从我升级到GCC 4.7.2以来它已经发生了,它曾经在GCC 4.6.2(Ubuntu版本,如果有帮助)中正常工作.虽然我知道解决问题的解决方法,但我想知道我做错了什么或者没有正确理解.由于lambas在内联函数内部,因此应在任何使用该函数的转换单元中定义它们.

- 编辑 -

还有一件事值得注意:示例程序中没有使用SearchGetComparer函数.

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);
}
Run Code Online (Sandbox Code Playgroud)

但是都没有从sample.cpp文件调用.该文件测试其他功能Table不相关.如果我在成员中评论该呼叫,则代码编译并链接.(我需要成员函数,它是虚拟的,它是上面类型擦除类的一部分Table).

nne*_*neo 5

已经向海湾合作委员会小组提交了一份错误报告,其中一位开发人员已经确认了这个问题.

与此同时,正如LucDanton在聊天中指出的那样,声明该功能static将解决问题.