Кто-нибудь подскажет, почему мой код создает ошибку в basic_ios и sstream? - PullRequest
0 голосов
/ 16 ноября 2011

Я получаю следующие ошибки, что является небольшим улучшением после нескольких недель (очень частичной) получения ошибок из из моего кода:

1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sstream(451) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        This diagnostic occurred in the compiler generated function 'std::basic_ostringstream<_Elem,_Traits,_Alloc>::basic_ostringstream(const std::basic_ostringstream<_Elem,_Traits,_Alloc> &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>,
1>            _Alloc=std::allocator<char>
1>        ]

Я перехожу из CLI в std:: классы, с которыми у меня еще меньше опыта.

Я думаю, что там, где говорится: «Эта диагностика произошла в сгенерированной компилятором функции», упоминаемая мной функция - std::ostringstream os;.

Я использую os примерно так:

        os << "Level: " << levelName << ", contains unexpected header at line " << (numMatched + 1)
            << "\nExpected:\n" << longStringHeader;
        addToErrorSTDstring(os);

потому что std::string конкатенация выстраивалась в линию с каждым добавлением.

Единственный способ использовать ostringstream -

bool LevelParser::addToErrorSTDstring(std::ostringstream os){

, который, как я считаю, ildjarn просто определенно определил как проблему для меня.

1 Ответ

3 голосов
/ 16 ноября 2011

Ошибка указывает, что вы пытаетесь скопировать экземпляр std::ostringstream, но все стандартные потоки являются не копируемыми объектами (в C ++ 11 они, однако, подвижны).

В этом корень проблемы , но, не увидев ваш реальный код, мы не сможем дать вам конкретные советы по его исправлению .


РЕДАКТИРОВАТЬ (в ответ на редактирование ОП):

addToErrorSTDstring несомненно принимает значение std::ostringstream, то есть имеет такую ​​подпись:

T addToErrorSTDstring(std::ostringstream os);

Вместо этого вам нужно передать его по ссылке, т.е. изменить подпись на что-то вроде:

T addToErrorSTDstring(std::ostringstream const& os);

или:

T addToErrorSTDstring(std::ostringstream& os);

(в зависимости от того, как вы его используете).

Если вы новичок в C ++, вам нужно прекратить то, над чем вы работаете, и освежить в общих чертах языковые основы, такие как ссылки и правильность констант.

...