Вопрос

Ссылаясь на Макрос формата C ++ / встроенный ostringstream

Вопрос там был о макросе, который позволяет встроенному объединению объектов создавать строку в стиле iostream.

Ответ был таков:

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
        ( std::ostringstream().seekp( 0, std::ios_base::cur ) << x ) \
    ).str()

Использование (например):

throw std::runtime_error(
        SSTR( "FooBar error: Value " << x << " exceeds " << y )
);

Это прекрасно работает - с GCC.Он также компилируется и запускается под управлением Visual C ++ 2005.Но в последнем случае все использования макроса приводят к получению пустых строк, и я совершенно ошарашен тем, почему и как это исправить ...?

Это было полезно?

Решение

К сожалению, у меня нет доступа к компилятору MSVC для тестирования.

Исходя из моего прошлого опыта работы с инструментами Microsoft, кажется, что Microsoft рассматривает языковые определения и стандарты не более чем как приблизительное руководство.(Я потерял много времени на проекты только для того, чтобы обнаружить, что Microsoft нарушила традицию, выпустив что-то столь базовое, как C99.)

Учитывая эту прискорбную ситуацию, я предлагаю вам поэкспериментировать с серией тривиальных программ.Такие вещи , как:

std::ostringstream() o;
o.seekp( 0, std::ios_base::cur ) << "foo";
cout << "Test1:  " << o << endl;

Или , возможно:

std::ostringstream() o;
cout << "Test2:  " << typeid(o).name() << endl;
cout << "Test3:  " << typeid(o.seekp( 0, std::ios_base::cur )).name() << endl;

Попытайтесь увидеть, в какой момент все перестает работать.Затем с этого момента обходите проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top