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

这条线没有做你认为它做的事情。您认为它定义了一个名为RequesttypeMKFAHttpRequest的对象,并使用 type 的临时对象初始化该对象std::string

事实上,它声明了一个名为的函数Request,它接受一个类型的参数std::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

这:

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

是作为 C++ 中的函数声明。试试这个

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

反而。

于 2013-02-08T14:47:14.433 回答
0

就个人而言,我认为最好的解决方案是 C++11 的统一初始化语法:

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

但是,另一种方法是简单地使用 static_cast:

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

static_cast 将为 std::string 找到匹配的构造函数调用,采用 char*。它还清楚地表明,您实际上是在从 char*“转换”到 std::string 以调用 MKFAHttpRequest 构造函数。

于 2013-02-10T17:41:59.297 回答