2016-08-04 17 views
0

noAutoResolveと呼ばれる:C++オプション/デフォルト引数

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未解決の外部シンボル「パブリック:無効__thiscallのNetworkService :: SEND_MESSAGE(クラスのstd ::のbasic_string、クラスのstd ::アロケータ>、クラスのstd ::このクラスは、次のようにして実装されています:shared_ptr、class QObject *、class std :: function)>) "(?send_message @ NetworkService @@ QAEXV?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @ D @ 2 @ V "$ shared_ptr @ UIMessage @ msg @@@ 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

+2

「不幸」を定義してください。それはエラーで苦情を言いますか?もしそうなら、どのエラーですか? – Harald

+1

*リンカー*で、*コンパイラ*ではないことが分かっていれば、おそらく関数(.cpp)の定義をリンクするのを忘れていたでしょう。しかし、実際のエラーメッセージを投稿するのをためらうことはありません:) – rustyx

+0

最後の引数を省略しないと、リンカーは満足していると言っていますか? – stijn

答えて

0

関数のfnパラメータのタイプはstd::function<void(int, std::shared_ptr<msg::IMessage> msg)>です。しかし、あなたが渡しているラムダは、次のとおりです。

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

この関数はvoid(int, msg::TMessagePtr)の署名を持っているので、msg::TMessagePtrからstd::shared_ptr<msg::IMessage>からの変換が存在しない場合、コードはコンパイルできません。

したがって、問題はオプションのパラメータではありません。クイックフィックスのために、C++コンパイラにアクセスできる場合は、autoと入力してください。

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

こんにちは、あなたのポストに感謝します。私は実際に次のtypedefを使っていることに言及しなかった:\t 'typedef std :: shared_ptr TMessagePtr;'同様に、最後の引数を追加する前に、私が提供したラムダでもすべてがうまくいきました。申し訳ありませんが – user66875

+0

@ user66875、ああ、大丈夫です。 –

+1

私は同じことを考えていましたが、おそらくTMessagePtrが共有ポインタのtypedef –