2016-08-04 11 views
0

Ich habe ein Verfahren mit einem optionalen/vorbelegt letzten Argumente definiert genannt noAutoResolve wie folgt:C++ optional/default Argument

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); 
} 

und höher:

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) 
{ 
} 

Der Linker ist nun unglücklich über nicht aufgelöste externe in der folgenden Zeile, in der ich das letzte Argument absichtlich weggelassen habe:

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

    }); 

Ist das in C++ nicht möglich?

Fehler LNK1120 1 nicht aufgelöste externe QTServer QTServer.exe 1
Fehler LNK2019 nicht aufgelöstes externes Symbol „public: void __thiscall NetworkService- :: send_message (Klasse std :: basic_string, Klasse std :: Allocator>, Klasse std :: shared_ptr, Klasse QObject *, Klasse std :: function)>) "(? send_message @ NetworkService @@ QAEXV? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@ V $ $ shared_ptr @ UIMessage @ msg @@@ 3 @ PAVQObject @@ V? $ Funktion @ $$ A6AXHV? $ Shared_ptr @ UIMessage @ msg @@@ std @@@ Z @ 3 @@ Z) referenziert in der Funktion "public : void __thiscall QTWindow :: ExecuteCommand (void)“(? ExecuteCommand @ QTWindow @@ QAEXXZ) QTServer QTWindow.obj 1

+2

definieren „unglücklich“. Beklagt es sich mit einem Fehler und wenn ja, welcher Fehler? – Harald

+1

Wenn Sie sicher sind, dass der * Linker * und nicht der * Compiler * unglücklich ist, haben Sie wahrscheinlich vergessen, die Definition der Funktion (.cpp) zu verknüpfen. Aber zögern Sie nicht, die eigentliche Fehlermeldung zu schreiben :) – rustyx

+0

Sie sagen, der Linker ist glücklich, wenn Sie das letzte Argument nicht auslassen? – stijn

Antwort

0

Der fn Parameter Ihrer Funktion ist der Typ std::function<void(int, std::shared_ptr<msg::IMessage> msg)>. Allerdings ist das Lambda Sie vorbei:

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

Diese Funktion hat die Unterschrift von void(int, msg::TMessagePtr), so dass, wenn es keine Umwandlung std::shared_ptr<msg::IMessage>-msg::TMessagePtr ist, kann der Code nicht kompilieren.

Ihr Problem ist also nicht der optionale Parameter. Für eine schnelle Lösung, wenn Sie Zugang zu einem C++ 14-Compiler haben, versuchen Sie die Lambda-Parameter wie auto bekommen:

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

Hallo, danke für deinen Beitrag. Ich vergaß tatsächlich zu erwähnen, dass ich den folgenden typedef benutze: \t 'typedef std :: shared_ptr TMessagePtr;'. Wie gesagt, vor dem Hinzufügen des letzten Arguments funktionierte alles gut, sogar mit dem von mir bereitgestellten Lambda. Sorry für die Erwähnung – user66875

+0

@ user66875, oh, okay dann. –

+1

Ich dachte das gleiche, aber dann dachte ich, dass TMessagePtr wahrscheinlich ein typedef für den geteilten Zeiger ist –