7

バックグラウンド

C++ でマルチスレッドの websocket サーバーを作成しています。

問題

HTTP パーサーを統合しようとすると、MKFAHTTPRequest Request( std::string( Buffer ) );実行中に完全にスキップされます。

プロジェクトをクリーンアップし、-Wall と -Werror を追加しました (Request未使用の変数であることがわかりますが、そうではありません)。

void operator()(){
    while( true ){
        if( m_Socket->is_open() ){
            char Buffer[1024]; 

            boost::system::error_code Error; 

            std::cout << "MKFAConnection::operator()() - Reading..." << std::endl;
            m_Socket->read_some( boost::asio::buffer( Buffer, sizeof( Buffer ) ), Error ); 

            if( !Error ){
                // This line is getting skipped!?!?!?
                MKFAHttpRequest Request( std::string( Buffer ) );

                m_Socket->write_some( boost::asio::buffer( std::string( "Hello World" ) ) ); 

            } else break; 

        } else break; 

    }

}
4

3 に答える 3

10
MKFAHttpRequest Request( std::string( Buffer ) );

この行は、あなたが思っていることをしません。Requesttypeという名前のオブジェクトを定義し、 typeMKFAHttpRequestの一時オブジェクトでオブジェクトを初期化すると思いますstd::string

実際、Requesttype の単一パラメーターを受け取り、 typestd::stringのオブジェクトを返すという名前の関数を宣言していますMKFAHttpRequest

これは、最も厄介な解析に関連しています (またはおそらくその例です)。

おそらく、次のいずれかで改善されます。

MKFAHttpRequest Request( (std::string( Buffer )) );
MKFAHttpRequest Request{ std::string( Buffer ) };
MKFAHttpRequest Request = std::string( Buffer );
MKFAHttpRequest Request = MKFAHttpRequest(std::string( Buffer ));

参照: http://en.wikipedia.org/wiki/Most_vexing_parse

于 2013-02-08T14:46:19.373 に答える
0

個人的には、C++11 の統一イニシャライザ構文が最善の解決策だと思います。

MKFAHttpRequest Request{ std::string( Buffer ) };

ただし、代わりに static_cast を使用するだけです。

MKFAHttpRequest Request( static_cast<std::string>( Buffer ) };

static_cast は、char* を取って std::string の一致するコンストラクター呼び出しを見つけます。また、MKFAHttpRequest コンストラクターを呼び出すために、実質的に char* から std::string に「キャスト」していることも明確になります。

于 2013-02-10T17:41:59.297 に答える
0

これ:

MKFAHttpRequest Request( std::string( Buffer ) );

は C++ の関数宣言です。これを試して

std::string s( Buffer );
MKFAHttpRequest Request( s );

代わりは。

于 2013-02-08T14:47:14.433 に答える