函数声明-c++可选/默认参数

function declaration - c++ optional/default argument

本文关键字:默认 参数 可选 声明 -c++ 函数      更新时间:2023-10-16

我定义了一个方法,该方法具有可选/默认的最后一个参数noAutoResolve,如下所示:

typedef std::shared_ptr<IMessage> TMessagePtr;
class NetworkService : public IConnectionManagerDelegate, public net::IStreamDelegate
{    
public:   
    void send_message(std::string identity, msg::TMessagePtr msg, QObject* window, std::function<void(int, std::shared_ptr<msg::IMessage> msg)> fn, bool noAutoResolve = false);
}

以及更高版本:

void NetworkService::send_message(std::string endpoint, msg::TMessagePtr msg, QObject* window, std::function<void(int res, std::shared_ptr<msg::IMessage> msg)> fn, bool noAutoResolve)
{
}

链接器现在对我故意省略最后一个参数的下一行中未解析的外部内容感到不满:

service_->send_message(endpoint_, msg, this, [this](int result, msg::TMessagePtr msg){
        // .....
    });

这在c++中是不可能的吗?

错误LNK1120 1未解析的外部QTServer QTServer.exe 1
错误LNK2019未解析的外部符号"public:void __thiscall NetworkService::send_message(类std::basic_string,类std::allocater>,类std::shared_ptr,类QObject*,类std::function(>("(?send_message@NetworkService@@QAEXV$basic_string@DU$char_traits@D@std@@V$allocator@D@2@@std@@V$shared_ptr@UIMessage@消息@@@3@PAVQObject@@V$函数@$$A6AXHV$shared_ptr@UIMessage@msg@@@std@@@Z@3@@Z(在函数"public:void __thiscall QTWindow::ExecuteCommand(void("(?ExecuteCommand@QTWindow@@QAEXXZ(QTServer QTWindow.obj 1

函数的fn参数的类型为std::function<void(int, std::shared_ptr<msg::IMessage> msg)>。然而,您正在传递的lambda是:

 [this](int result, msg::TMessagePtr msg){
     // .....
 }

此函数的签名为void(int, msg::TMessagePtr),因此如果没有从std::shared_ptr<msg::IMessage>msg::TMessagePtr的转换,则代码无法编译。

因此,您的问题与可选参数无关。为了快速修复,如果您可以访问C++14编译器,请尝试将lambda参数获取为auto:

 [this](auto result, auto msg){
     // .....
 }