[英]quickfix toAdmin to add username , password error
我已經在這里引用: 由於缺少密碼,QuickFix登錄失敗
而在這里: 如何使登錄部分成為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中的編譯器錯誤:
錯誤:無法dynamic_cast消息? (類型為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");
}
你有沒有嘗試過
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);
我認為這可能是正確取消引用消息的問題。
您無需投放信息。 最終,您最終調用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);
}
}
}
錯誤消息表明您沒有#include "quickfix/fix44/Logon.h"
。
這就是為什么它認為您使用的是不完整的類型。 您的編譯器現在可能只看到一個前向聲明: class FIX44::Logon;
並且它不知道此類包含哪些方法。
其他答案正確地表明您甚至不需要垂頭喪氣
message.setField(FIX::Username(username));
message.setField(FIX::Password(password));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.