Ошибка копирования в конструкторе без явного копирования

Я пытаюсь создать с нуля простую функциональность регистрации, с потоком вроде ‘<<интерфейс, и я столкнулся с проблемой компилятора. Вот основы моего кода:

#include <string.h>
#include <sstream>
#include <iostream>

class Logger
{
public:
class Buffer
{
public:
Buffer(Logger &parent) : mPar(parent)
{
}

~Buffer(void)
{
mPar.endline(os);
}

template<class T>
Buffer& operator<<(const T& x)
{
os << x;
return *this;
}

Logger& mPar;
std::ostringstream os;
};

Buffer write(void)
{
return Buffer(*this);
}

void endline(std::ostringstream& os)
{
std::cout << os.str() << std::endl;
}
};

int main(int argc, char **argv)
{
Logger log;

log.write() << "fred" << 3 << "bob";
}

Я получаю следующие ошибки:

In file included from /usr/include/c++/4.6/ios:45:0,
from /usr/include/c++/4.6/istream:40,
from /usr/include/c++/4.6/sstream:39,
from test.cpp:2:
/usr/include/c++/4.6/bits/ios_base.h: In copy constructor ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’:
/usr/include/c++/4.6/bits/ios_base.h:788:5: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
/usr/include/c++/4.6/bits/basic_ios.h:64:11: error: within this context
In file included from test.cpp:2:0:
/usr/include/c++/4.6/sstream: In copy constructor ‘std::basic_ostringstream<char>::basic_ostringstream(const std::basic_ostringstream<char>&)’:
/usr/include/c++/4.6/sstream:373:11: note: synthesized method ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’ first required here
/usr/include/c++/4.6/streambuf: In copy constructor ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’:
/usr/include/c++/4.6/streambuf:782:7: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const __streambuf_type&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_streambuf<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]’ is private
/usr/include/c++/4.6/sstream:60:11: error: within this context
/usr/include/c++/4.6/sstream: In copy constructor ‘std::basic_ostringstream<char>::basic_ostringstream(const std::basic_ostringstream<char>&)’:
/usr/include/c++/4.6/sstream:373:11: note: synthesized method ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’ first required here
test.cpp: In copy constructor ‘Logger::Buffer::Buffer(const Logger::Buffer&)’:
test.cpp:8:8: note: synthesized method ‘std::basic_ostringstream<char>::basic_ostringstream(const std::basic_ostringstream<char>&)’ first required here
test.cpp: In member function ‘Logger::Buffer Logger::write()’:
test.cpp:33:22: note: synthesized method ‘Logger::Buffer::Buffer(const Logger::Buffer&)’ first required here

Из того, что я смог найти, ошибки заключаются в том, что вы не можете вызвать конструктор копирования в ostringstream. Насколько я могу судить, я не вызываю конструктор копирования напрямую и не копирую Buffer, а только конструирую его в операторе return.

Другая интересная вещь заключается в том, что этот код прекрасно компилируется в Visual Studio 2010, где я его собрал, прежде чем интегрировать в свое приложение (которое скомпилировано с использованием GCC 4.6.3).

Правильно ли я истолковал проблему, и если да, то где скрытая копия и как ее устранить?

2

Решение

Первая проблема заключается в том, что std::ostringstream не копируется, и вы пытаетесь создать его копию при создании копии Buffer,

Причина, по которой вы создаете копию Buffer в этом return заявление:

return Buffer(*this);

Это твой класс Buffer не имеет неявно сгенерированного конструктора перемещения. И причина, почему он не имеет, в том, что Buffer имеет определяемый пользователем деструктор, который запрещает неявную генерацию конструктора перемещения.

Вы можете определить одно явно:

    Buffer(Buffer&& b)
:
mPar(b.mPar),
os(std::move(b.os))
{
}

Но вам следует учитывать тот факт, что некоторые реализации Стандартной библиотеки не полностью совместимы и не реализуют переместить конструктор std::ostringstream.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]