Я пишу многопоточный сервер websocket на C ++.
Когда я пытаюсь интегрировать мой парсер 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;
}
}
MKFAHttpRequest Request( std::string( Buffer ) );
Эта строка не делает то, что вы думаете, что делает. Вы думаете, что это определяет объект с именем Request
типа MKFAHttpRequest
и инициализирует объект с временным объектом типа 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 ));
Это:
MKFAHttpRequest Request( std::string( Buffer ) );
это как объявление функции в C ++.
Попробуй это
std::string s( Buffer );
MKFAHttpRequest Request( s );
вместо.
Лично я считаю, что лучшим решением является единый синтаксис инициализатора 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.