【问题标题】:Strange use of [] in C++. What is happening? [duplicate]C++ 中 [] 的奇怪用法。怎么了? [复制]
【发布时间】:2014-11-02 09:01:35
【问题描述】:

首先,这不是关于数组或运算符[] 重载的虚拟问题!

我正在尝试编译 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++ 版本,但问题不在于。

我想理解这段代码,因为对我来说,[] 的这种用法在语法上是不正确的。谁能解释一下这里发生了什么。

【问题讨论】:

  • 这是一个 C++11 lambda:en.cppreference.com/w/cpp/language/lambda.
  • 如果是 C++11 功能,您可能需要 gcc 4.8 或更高版本。 @Ian,这可能是一个更好的答案,因为它回答了特定的问题(“我想理解......”)。只要确保它不是仅链接的答案:-)
  • @paxdiablo;我大体上同意,但现在不想写一个描述性的答案。当其他人这样做时,OP 可以开始浏览该链接(或查看 SO,现在他知道它是什么,因为 C++11 lambda 已经得到很好的讨论)。
  • 欢迎使用现代 C++。现在您可以抛开所有特定于 Qt 的 hack。

标签: c++


【解决方案1】:

这是一个 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 函数更为惯用。

【讨论】:

  • operator () 应该是 const。
  • 您可能正在寻找 -std=c++11-std=c++0x 编译器选项,具体取决于您的 GCC 版本。
【解决方案2】:

回答这个问题:

我想理解这段代码,因为对我来说,[] 的这种用法在语法上是不正确的。谁能解释一下这里发生了什么。

在 C++ 中,您可以声明 lambda 函数:

// declare lambda function and assign it to foo
auto foo = [](){
     std::cout << "hello world" << std::endl;
};

foo(); // call foo

您的代码中发生的情况是 getObjects() 被传递一个 lambda 函数作为输入。

return ExtensionSystem::PluginManager::getObjects<IDocumentFactory>(

    // this is the lambda function
    [](IDocumentFactory *factory) {
        return !qobject_cast<IEditorFactory *>(factory);
    }


); 

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 2011-05-21
    • 2021-01-12
    • 1970-01-01
    • 2012-04-29
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多