Boost Library Format; получение std::string

Я хочу добавить строку, которую я форматирую, используя библиотеку boost следующим образом

boost::container::vector<std::string> someStringVector;
someStringVector.push_back(
    format("after is x:%f y:%f and before is x:%f y:%f\r\n") % 
    temp.x %
    temp.y %
    this->body->GetPosition().x %
    this->body->GetPosition().y;

Компилятор жалуется, что он не может преобразовать типы, и я попытался добавить .str() в конец того, какой формат возвращается, но он все еще жаловался.

Сообщение об ошибке, которое я получил, было:

error C2664: 'void boost::container::vector<T>::push_back(
  const std::basic_string<_Elem,_Traits,_Ax> &)' :
  cannot convert parameter 1 from
    'boost::basic_format<Ch>' to 
    'const std::basic_string<_Elem,_Traits,_Ax> &'

У кого-нибудь есть понимание?

Ответ 1

Вам нужно обернуть формат в вызове boost:: str, например:

str( format("after is x:%f y:%f and before is x:%f y:%f\r\n")
     % temp.x % temp.y % this->body->GetPosition().x % this->body->GetPosition().y)

Ответ 2

Добавление ".str()" к результирующему объекту формата должно быть достаточно (и работает для меня). Из вашего вопроса неясно, как вы это сделали, но я заметил, что ваш пример пропускает закрывающие parens на push_back().

Обратите внимание, что вы хотите вызывать str() в объекте формата, возвращаемом последним оператором%, самый простой способ сделать это - просто обернуть всю строку формата в виде таких символов:

boost::container::vector<std::string> someStringVector;
someStringVector.push_back(
    (format("after is x:%f y:%f and before is x:%f y:%f\r\n") % 
    temp.x %
    temp.y %
    this->body->GetPosition().x %
    this->body->GetPosition().y).str() );