C ++跳过代码行?

时间:2013-02-08 14:40:43

标签: c++ gcc g++ skip

背景

我正在用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; 

    }

}

3 个答案:

答案 0 :(得分:10)

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

此行不符合您的想法。您认为它定义了一个名为Request的{​​{1}}类型的对象,并使用MKFAHttpRequest类型的临时对象初始化该对象。

实际上,它声明了一个名为std::string的函数,该函数接受类型为Request的单个参数,并返回类型为std::string的对象。

这与最令人烦恼的解析(或可能是一个例子)有关。

也许其中一个会让它变得更好:

MKFAHttpRequest

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

答案 1 :(得分:0)

这:

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

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

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

代替。

答案 2 :(得分: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构造函数。