首先,这不是关于数组或运算符[]重载的虚拟问题!
我正在尝试编译Qt Creator并且我在此方法中收到错误:
static QList<IDocumentFactory*> getNonEditorDocumentFactories()
{
return ExtensionSystem::PluginManager::getObjects<IDocumentFactory>(
[](IDocumentFactory *factory) {
return !qobject_cast<IEditorFactory *>(factory);
});
}
错误是:
mainwindow.cpp:748: error: expected primary-expression before ‘[’ token
mainwindow.cpp:748: error: expected primary-expression before ‘]’ token
mainwindow.cpp:748: error: expected primary-expression before ‘*’ token
mainwindow.cpp:748: error: ‘factory’ was not declared in this scope
我知道我在编译Qt Creator时做错了,可能是g ++版本,但问题不在于此。
我想理解这段代码,因为对我来说[]
的使用在语法上是不正确的。有人可以解释一下这里发生了什么。
答案 0 :(得分:4)
这是一个lambda函数。它是在C ++ 11中引入的。您可以在http://en.cppreference.com/w/cpp/language/lambda获取更多详细信息。
如果您无法使用lambda函数,则C ++ 03中的等效代码将为:
struct MyFunctor
{
bool operator()(IDocumentFactory *factory) const
{
return !qobject_cast<IEditorFactory*>(factory);
}
};
static QList<IDocumentFactory*> getNonEditorDocumentFactories()
{
return ExtensionSystem::PluginManager::getObjects<IDocumentFactory>(MyFunctor());
}
您也可以在C ++ 11中使用上述内容,但在c ++ 11中使用lambda函数更为惯用。
答案 1 :(得分:0)
回答这个问题:
我想理解这段代码,因为对我来说,[]的使用在语法上是不正确的。有人可以解释一下这里发生了什么。
在C ++中,您可以声明lambda函数:
// declare lambda function and assign it to foo
auto foo = [](){
std::cout << "hello world" << std::endl;
};
foo(); // call foo
代码中发生的事情是,getObjects&lt;&gt;()正在传递lambda函数作为输入。
return ExtensionSystem::PluginManager::getObjects<IDocumentFactory>(
// this is the lambda function
[](IDocumentFactory *factory) {
return !qobject_cast<IEditorFactory *>(factory);
}
);