我指的是这里:
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& (目标不是指针或对完整类型的引用)

然后我将代码更改为
    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);

我认为这可能是正确取消引用消息的问题。

10-08 18:30