Глог в Visual Studio 2015

Я пытаюсь создать библиотеку Google glog для Windows с помощью Visual Studio 2015. После добавления #include, чтобы обойти проблему std::min в Windows, я получаю 2 основные ошибки (1 повторяется несколько раз) ниже.

1>c:\glog\glog-0.3.3\src\windows\port.h(117): warning C4005: 'va_copy': macro redefinition
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\stdarg.h(20): note: see previous definition of 'va_copy'
1>c:\glog\glog-0.3.3\src\windows\port.cc(58): error C2084: function 'int snprintf(char *const ,const size_t,const char *const ,...)' already has a body
1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1932): note: see previous definition of 'snprintf'
1>  vlog_is_on.cc
1>c:\glog\glog-0.3.3\src\windows\port.h(117): warning C4005: 'va_copy': macro redefinition
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\stdarg.h(20): note: see previous definition of 'va_copy'
1>c:\glog\glog-0.3.3\src\windows\glog\logging.h(1266): error C2280: 'std::basic_ios<char,std::char_traits<char>>::basic_ios(const std::basic_ios<char,std::char_traits<char>> &)': attempting to reference a deleted function
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\ios(189): note: see declaration of 'std::basic_ios<char,std::char_traits<char>>::basic_ios'
1>  c:\glog\glog-0.3.3\src\windows\glog\logging.h(1266): note: This diagnostic occurred in the compiler generated function 'google::LogMessage::LogStream::LogStream(google::LogMessage::LogStream &&)'
1>  utilities.cc

Кажется, это проблема с сгенерированной компилятором функцией перемещения, но ее явное удаление также не работает.

LogMessage(const LogMessage&&) = удалить;

Любые идеи?

Привет, Майк


person Mike    schedule 27.07.2015    source источник


Ответы (1)


Сгенерированная функция не является LogMessage(const LogMessage&&) = delete;
, но является:
LogStream::LogStream(google::LogMessage::LogStream &&).

Внутренне это попытается вызвать конструктор копирования LogStream и, следовательно, ostream, который помечен как удаленный.
Решение:
объявить внутри класса LogStream:
LogStream(const LogStream&) = удалить;
LogStream& operator=(const LogStream&) = удалить;;

Ваше здоровье

person Iulian Rotaru    schedule 08.09.2015
comment
вот мои модификации класса logstream, и он компилируется под vs2015: char* str() const { return pbase(); } private: LogStream(const LogStream&) = удалить; LogStream& operator=(const LogStream&) = удалить; base_logging::LogStreamBuf streambuf_; интервал ctr_; // Взлом счетчика (для макроса LOG_EVERY_X()) LogStream *self_; // Хак проверки непротиворечивости }; - person Iulian Rotaru; 22.09.2015
comment
Превосходно! Это работает и для меня. Большое спасибо. - person Mike; 30.09.2015