quickfix toAdmin添加用户名,密码错误

时间:2016-03-08 23:51:16

标签: c++ quickfix

我在这里提到过: 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");
}

3 个答案:

答案 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));