C++ 快速修复要添加用户名、密码的管理员错误

C++ 快速修复要添加用户名、密码的管理员错误,c++,quickfix,C++,Quickfix,我在这里提到: 在这里: 要在管理员中添加用户名和密码,请执行以下操作: void Application::toAdmin( FIX::Message& message, const FIX::SessionID& sessionID) { if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) { FIX44::Logon& logon

我在这里提到:

在这里:

要在管理员中添加用户名和密码,请执行以下操作:

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 ); 
    }
}
这一次,编译器再次出错:

error: invalid use of incomplete type ??class FIX44::Logon??
logon_message->setField( username );
              ^
我应该修改什么以便在中正确设置用户名和密码 功能到管理员?登录消息->设置字段(用户名)有什么问题

编辑:

根据本网页:

以下几点对我来说很好:

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\u message=dynamic\u cast(message);

FIX44::Logon*Logon\u message=dynamic\u cast(*(message));

FIX44::Logon*Logon\u message=dynamic\u cast(&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);
                }
            }
        }

错误消息表明您没有
#包括“quickfix/fix44/Logon.h”

这就是为什么它认为您使用的是不完整类型。您的编译器现在可能只看到一个声明的转发:
classfix44::Logon
其他答案正确地表明,你甚至不需要沮丧

message.setField(FIX::Username(username));
message.setField(FIX::Password(password));

你肯定是在正确的轨道上,只是一些C++指针把你绊倒了。下面瓦希德·布朗的回答可能会让你明白。
FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(&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);
                }
            }
        }
message.setField(FIX::Username(username));
message.setField(FIX::Password(password));