我在这里提到过: QuickFix Login Failed due to password missing
在这里: 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中的编译器错误:
错误:不能dynamic_cast ??消息?? (类型??类FIX :: Message ??)类型??类FIX44 :: Logon&amp; ?? (目标不是指针或对完整类型的引用)
然后我将代码更改为
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-&gt; 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");
}
答案 0 :(得分: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);
我认为这可能是正确解除引用消息的问题。
答案 1 :(得分: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);
}
}
}
答案 2 :(得分:0)
错误消息表明您没有#include "quickfix/fix44/Logon.h"
。
这就是为什么它认为您使用的是不完整的类型。您的编译器现在可能只看到一个前向声明:class FIX44::Logon;
,并且它不知道此类包含哪些方法。
其他答案正确地表明,您甚至不需要垂头丧气
message.setField(FIX::Username(username));
message.setField(FIX::Password(password));