我已经使用名为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
答案 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){
// .....
}