2014-11-15 3 views
1

FatalMessageAssembler - это класс, который собирает сообщения во внутреннюю переменную струнного потока с помощью оператора <<. Он печатает сообщение переменной result и завершает заявку оператором +=. (У меня есть причины, чтобы не поставить его в функцию)std :: ios_base :: ios_base (const std :: ios_base) является приватным

Заголовок:

class FatalMessageAssembler 
{ 
public: 
    FatalMessageAssembler(); 
    std::stringstream contents; 
    void operator+=(FatalMessageAssembler& result); 
}; 
template<typename msg_type> FatalMessageAssembler& operator<<(FatalMessageAssembler& target,const msg_type msg); 
namespace NLog 
{ 
    extern FatalMessageAssembler assembler; 
} 

Источник:

FatalMessageAssembler::FatalMessageAssembler() 
{ 

} 
FatalMessageAssembler NLog::assembler=FatalMessageAssembler(); 
template<typename msg_type> FatalMessageAssembler& operator<<(FatalMessageAssembler& target, const msg_type msg) 
{ 
    target.contents<<msg; 
    return target; 
} 
void FatalMessageAssembler::operator+=(FatalMessageAssembler& result) 
{ 
    qFatal(result.contents.str().c_str()); 
    result.contents.str("");//I'm not sre if qFatal() can be handled not to terminate app 
    result.contents.clear(); 
} 

Это создает ошибку std::ios_base::ios_base(const std::ios_base) is private. Я didn't forget reference in return type.

Полный журнал:

06:36:41: Running steps for project tsl... 
06:36:41: Configuration unchanged, skipping qmake step. 
06:36:41: Starting: "/usr/bin/make" 
g++ -c -m64 -pipe -g -Wall -W -D_REENTRANT -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I../tsl -I/usr/include/qt4/QtCore -I/usr/include/qt4 -I. -I../tsl -I. -o servicelogger.o ../tsl/servicelogger.cpp 
In file included from /usr/include/c++/4.8/ios:42:0, 
       from /usr/include/c++/4.8/ostream:38, 
       from /usr/include/c++/4.8/iterator:64, 
       from /usr/include/qt4/QtCore/qlist.h:50, 
       from /usr/include/qt4/QtCore/qobject.h:50, 
       from /usr/include/qt4/QtCore/QObject:1, 
       from ../tsl/servicelogger.h:5, 
       from ../tsl/servicelogger.cpp:2: 
/usr/include/c++/4.8/bits/ios_base.h: In copy constructor 'std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)': 
/usr/include/c++/4.8/bits/ios_base.h:786:5: error: 'std::ios_base::ios_base(const std::ios_base&)' is private 
    ios_base(const ios_base&); 
    ^
In file included from /usr/include/c++/4.8/ios:44:0, 
       from /usr/include/c++/4.8/ostream:38, 
       from /usr/include/c++/4.8/iterator:64, 
       from /usr/include/qt4/QtCore/qlist.h:50, 
       from /usr/include/qt4/QtCore/qobject.h:50, 
       from /usr/include/qt4/QtCore/QObject:1, 
       from ../tsl/servicelogger.h:5, 
       from ../tsl/servicelogger.cpp:2: 
/usr/include/c++/4.8/bits/basic_ios.h:66:11: error: within this context 
    class basic_ios : public ios_base 
     ^
In file included from ../tsl/servicelogger.h:8:0, 
       from ../tsl/servicelogger.cpp:2: 
/usr/include/c++/4.8/sstream: In copy constructor 'std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)': 
/usr/include/c++/4.8/sstream:502:11: note: synthesized method 'std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)' first required here 
    class basic_stringstream : public basic_iostream<_CharT, _Traits> 
     ^
In file included from /usr/include/c++/4.8/ios:43:0, 
       from /usr/include/c++/4.8/ostream:38, 
       from /usr/include/c++/4.8/iterator:64, 
       from /usr/include/qt4/QtCore/qlist.h:50, 
       from /usr/include/qt4/QtCore/qobject.h:50, 
       from /usr/include/qt4/QtCore/QObject:1, 
       from ../tsl/servicelogger.h:5, 
       from ../tsl/servicelogger.cpp:2: 
/usr/include/c++/4.8/streambuf: In copy constructor 'std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)': 
/usr/include/c++/4.8/streambuf:802:7: error: 'std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]' is private 
     basic_streambuf(const basic_streambuf& __sb) 
    ^
In file included from ../tsl/servicelogger.h:8:0, 
       from ../tsl/servicelogger.cpp:2: 
/usr/include/c++/4.8/sstream:64:11: error: within this context 
    class basic_stringbuf : public basic_streambuf<_CharT, _Traits> 
     ^
/usr/include/c++/4.8/sstream: In copy constructor 'std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)': 
/usr/include/c++/4.8/sstream:502:11: note: synthesized method 'std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)' first required here 
    class basic_stringstream : public basic_iostream<_CharT, _Traits> 
     ^
In file included from ../tsl/servicelogger.cpp:2:0: 
../tsl/servicelogger.h: In copy constructor 'FatalMessageAssembler::FatalMessageAssembler(const FatalMessageAssembler&)': 
../tsl/servicelogger.h:39:7: note: synthesized method 'std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)' first required here 
class FatalMessageAssembler 
    ^
../tsl/servicelogger.cpp: At global scope: 
../tsl/servicelogger.cpp:47:61: note: synthesized method 'FatalMessageAssembler::FatalMessageAssembler(const FatalMessageAssembler&)' first required here 
FatalMessageAssembler NLog::assembler=FatalMessageAssembler(); 
                  ^
../tsl/servicelogger.cpp: In member function 'void FatalMessageAssembler::operator+=(FatalMessageAssembler&)': 
../tsl/servicelogger.cpp:55:41: warning: format not a string literal and no format arguments [-Wformat-security] 
    qFatal(result.contents.str().c_str()); 
             ^
make: *** [servicelogger.o] Error 1 
06:36:46: The process "/usr/bin/make" exited with code 2. 
Error while building/deploying project tsl (kit: Desktop) 
When executing step "Make" 
06:36:46: Elapsed time: 00:05. 
+2

Вы не можете копировать потоки. – Rapptz

+0

Но где копировать потоки? – user2136963

+0

'FatalMessageAssembler NLog :: assembler = FatalMessageAssembler();' прямо здесь. Как и ошибка, вы говорите. Также 'ss.str(). C_str()' неверно. – Rapptz

ответ

3
FatalMessageAssembler NLog::assembler=FatalMessageAssembler(); 

Это решающая линия, которая вызывает ошибку. Вы не можете копировать потоки, и поэтому вы не можете скопировать FatalMessageAssembler s . Тем не менее, инициализация с временным фактически не нужна.

FatalMessageAssembler NLog::assembler; 

Следует также инициализировать assembler соответствующим образом.

1) Конструктор перемещения вашего класса неявно объявлен, потому что stringstream, тип одного из членов, не может быть скопирован.

+0

Собственно, я показал это. Благодаря! – user2136963

+0

@ user2136963 lol, я полностью упустил это! : D – Columbo

Смежные вопросы