2016-03-08 176 views
1

我已经referd到这里: QuickFix Login Failed due to password missing的quickfix toAdmin添加用户名,密码错误

这里: How to make the login part in QuickFIX

在toAdmin添加用户名和密码,像下面:

void Application::toAdmin(FIX::Message& message, const FIX::SessionID& sessionID) 
{ 
    if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) 
    { 
     FIX44::Logon& logon_message = dynamic_cast<FIX44::Logon&>(message); 
     FIX::Username username = std::string("my_username") ; 
     logon_message.setField(username); 
    } 
} 

这导致gcc 4.8.2编译错误:

错误:can not dynamic_cast ?? me ssage? (类型为FIX :: Message类型)类型FIX44 :: Logon & ??再次(目标没有指针或引用来完成型)

然后我我的代码更改为

FIX44::Logon* logon_message = (FIX44::Logon*)(&message); 
    FIX::Username username = std::string("my_username") ; 
    logon_message->setField(username); 

这个时候,编译器错误:

error: invalid use of incomplete type ??class FIX44::Logon?? 
logon_message->setField(username); 
      ^

我应该怎么修改,这样我可以正确设置用户名和密码 函数toAdmin? logon_message-> setField(username)有什么问题; ?

编辑:

根据这个网页: https://sourceforge.net/p/quickfix/mailman/message/26233433/

以下优良工程对我说:

if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) 
{ 
    message.getHeader().setField(553, "XXXXXXXXX"); 
    message.getHeader().setField(554, "yyyyyyyyy"); 
} 
+1

你绝对是在正确的轨道上,只是一些C++指针的东西绊倒你。下面的Waheed Brown的回答可能会让你直观。 –

回答

1

你试过

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(message); 

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(*(message)); 

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(&message); 

我想这可能是正确解引用消息的问题。

0

您不需要投射您的讯息。最终你最终调用setField,这是一个可用于基类FIX :: Message的函数。

 void FIXSession::toAdmin(FIX::Message& msg, const FIX::SessionID& sid) 
     { 
      const std::string& field = msg.getHeader().getField(FIX::FIELD::MsgType); 

      if (FIX::MsgType_Logon == field) 
      { 
       FIX::Dictionary dd(m_sessionSettings.get(sid)); 

       if (dd.has(FixSettingUsername)) 
       { 
        FIX::Username username = dd.getString(FixSettingUsername); 
        msg.setField(username); 
       } 
       if (dd.has(FixSettingPassword)) 
       { 
        FIX::Password password = dd.getString(FixSettingPassword); 
        msg.setField(password); 
       } 

       if (dd.has(FIX::SEND_RESETSEQNUMFLAG)) 
       { 
        FIX::ResetSeqNumFlag rsn(dd.getBool(FIX::SEND_RESETSEQNUMFLAG)); 
        msg.setField(rsn); 
       } 
      } 
     } 
相关问题