c ++可选/默认参数

时间:2016-08-04 11:42:48

标签: c++ function-declaration

我已经使用名为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未解析的外部符号&#34; public:void __thiscall NetworkService :: send_message(class std :: basic_string,class std :: allocator&gt;,class std :: shared_ptr,class QObject *,class std :: function)&gt; )&#34; (?send_message @ @@网络服务QAEXV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ V'$ @的shared_ptr @ UIMessage MSG @@@ 3 @ PAVQObject @ @V?$ function @ $$ A6AXHV?$ shared_ptr @ UIMessage @ msg @@@ std @@@ Z @ 3 @@ Z)在函数&#34中引用; public:void __thiscall QTWindow :: ExecuteCommand(void)&# 34; (?ExecuteCommand @ QTWindow @@ QAEXXZ)QTServer QTWindow.obj 1

1 个答案:

答案 0 :(得分:0)

您的函数的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){
     // .....
 }