【问题标题】:QList as a function parameter - Linking Error - LNK2019QList 作为函数参数 - 链接错误 - LNK2019
【发布时间】:2013-06-30 10:16:49
【问题描述】:

我对 QList 作为函数参数有疑问,如果你能帮助我,我会很高兴。

我有这个代码例如:

void SpinBoxList_Enable(QList<QWidget *> *spinBoxList)
{
    foreach(QWidget* mWidget,*spinBoxList)
        mWidget->setEnabled(false);
}

在实现文件中,我使用QList&lt;QWidget *&gt; 变量作为指针:

SpinBoxList_Enable(&controlBoardSpinBoxList);

controlBoardSpinBoxListQList&lt;QWidget *&gt;的变量)。

函数ToggleBoards_Slot(bool) 是一个使用的槽。编译时,我收到以下错误消息:

1>cmosaixserialnumber.obj : error LNK2019: unresolved external symbol "private: void __cdecl CMosaixSerialNumber::SpinBoxList_Disable(class QList<class QWidget *> *)" (?SpinBoxList_Disable@CMosaixSerialNumber@@AEAAXPEAV?$QList@PEAVQWidget@@@@@Z) referenced in function "public: void __cdecl CMosaixSerialNumber::ToggleBoards_Slot(bool)" (?ToggleBoards_Slot@CMosaixSerialNumber@@QEAAX_N@Z)
1>cmosaixserialnumber.obj : error LNK2019: unresolved external symbol "private: void __cdecl CMosaixSerialNumber::SpinBoxList_Enable(class QList<class QWidget *> *)" (?SpinBoxList_Enable@CMosaixSerialNumber@@AEAAXPEAV?$QList@PEAVQWidget@@@@@Z) referenced in function "private: void __cdecl CMosaixSerialNumber::on_ControlBoardCheckBox_StateChanged(int)" (?on_ControlBoardCheckBox_StateChanged@CMosaixSerialNumber@@AEAAXH@Z)

我该如何解决这个问题?

【问题讨论】:

    标签: c++ qt lnk2019 qlist


    【解决方案1】:

    您使用指针调用函数,但函数参数不是指针。我建议您将参数更改为引用(以避免复制):

    void SpinBoxList_Enable(QList& spinBoxList) { ... }
    

    然后在不使用地址运算符的情况下调用它:

    SpinBoxList_Enable(controlBoardSpinBoxList);
    

    【讨论】:

    • 还有函数体中的*spinBoxList需要更正。
    • 嗨 Joachim,我现在这样做了,我收到以下错误消息:1>cmosaixserialnumber.obj:错误 LNK2019:未解析的外部符号“private:void __cdecl CMosaixSerialNumber::SpinBoxList_Disable(class QList &)" (?SpinBoxList_Disable@CMosaixSerialNumber@@AEAAXAEAV?$QList@PEAVQWidget@@@@@Z) 在函数 "public: void __cdecl CMosaixSerialNumber::ToggleBoards_Slot(bool)" (?ToggleBoards_Slot@CMosaixSerialNumber@@QEAAX_N@Z) 中引用
    • 1>cmosaixserialnumber.obj : 错误 LNK2019: 无法解析的外部符号 "private: void __cdecl CMosaixSerialNumber::SpinBoxList_Enable(class QList &)" (?SpinBoxList_Enable@CMosaixSerialNumber@@AEAAXAEAV?$ QList@PEAVQWidget@@@@@Z) 在函数“private: void __cdecl CMosaixSerialNumber::on_ControlBoardCheckBox_StateChanged(int)”中引用 (?on_ControlBoardCheckBox_StateChanged@CMosaixSerialNumber@@AEAAXH@Z)
    • 虽然我会使用 const QList&
    【解决方案2】:

    Qt 中的容器被引用计数并隐式共享以供读取。您不需要将 QList 作为指针传递,甚至不需要将其作为引用传递(正如 Joachim 建议的那样),即使这是容器的常用且良好的做法(尤其是 STL,否则深拷贝)。

    您可以传递实际的 QList,只要您只从中读取它就不会被复制,如果您尝试写入操作,它将创建一个副本并改为写入它。阅读更多关于here的信息。

    【讨论】:

    • @FrankOsterfeld - 取决于使用上下文,如果您不打算更改任何内容,请设置为 const,这不用说。
    • 在他的例子中,他没有修改容器。
    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 2023-03-30
    • 2019-08-25
    • 2015-07-08
    • 1970-01-01
    • 2021-07-19
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多