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){
     // .....
 }
Другие вопросы по тегам