C++ необязательный аргумент / аргумент по умолчанию
Я определил метод с необязательным / по умолчанию последний аргумент называется 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::allocator >, класс std::shared_ptr, класс QObject *, класс std::function)>)" (? Send_message@NetworkService@@QAEXV?$basic_string@DU?$char_traits@D@ станд @@V?$ распределитель @D@2@@ станд @@V?$shared_ptr@UIMessage@ тзд @@@3@PAVQObject@@V?$function@$$A6AXHV?$shared_ptr@UIMessage@msg@@@std@@@Z@3@@Z) ссылка на функцию "public: void __thiscall QTWindow::ExecuteCommand(void)" (?ExecuteCommand@QTWindow@@QAEXXZ) QTServer QTWindow.obj 1
1 ответ
fn
Параметром вашей функции является тип std::function<void(int, std::shared_ptr<msg::IMessage> msg)>
, Тем не менее, лямбда, которую вы передаете:
[this](int result, msg::TMessagePtr msg){
// .....
}
Эта функция имеет подпись void(int, msg::TMessagePtr)
так что если нет конвертации из std::shared_ptr<msg::IMessage>
в msg::TMessagePtr
код не может быть скомпилирован.
Поэтому ваша проблема не в необязательном параметре. Для быстрого исправления, если у вас есть доступ к компилятору C++14, попробуйте получить параметры лямбды как auto
:
[this](auto result, auto msg){
// .....
}