C ++ Boost-iostream: загадочная ошибка при включении filtering_streambuf.hpp - PullRequest
0 голосов
/ 01 июля 2018

Я использовал библиотеку boost iostream (версия 1.65), в основном используя следующий заголовок: <boost/iostreams/filtering_streambuf.hpp> без проблем.

После того, как я добавил другую библиотеку cpprest в свой проект (https://github.com/Microsoft/cpprestsdk). Я получаю это предупреждение в моем cmake:

usr/bin/ld: warning: libboost_system.so.1.58.0, needed by /usr/lib/libcpprest.so, may conflict with libboost_system.so.1.65.0

Также после включения заголовков boost я получаю эту загадочную ошибку компиляции:

/usr/local/include/boost/iostreams/detail/access_control.hpp: In constructor ‘boost::iostreams::detail::prot_<U>::prot_(V)’:
/usr/local/include/boost/iostreams/detail/access_control.hpp:37:43: error: class ‘boost::iostreams::detail::prot_<U>’ does not have any field named ‘v’
         template<typename V> prot_(V v) : U(v) { }

Это вызвано несовместимостью Boost 1.58 (который используется cpprest) и 1.65? Или это ошибка в Boost iostream?

На самом деле я понизил свое повышение до 1,58, но все еще вижу ту же ошибку.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я понял, что это проблема с определениями. Код Microsoft определяет вызов макроса U(x), а код Boost использует U в качестве переменной шаблона. После добавления #define _TURN_OFF_PLATFORM_STRING перед импортом заголовка кода Microsoft проблема была решена.

0 голосов
/ 01 июля 2018

Да, это похоже на конфликт версий.

Обратите внимание, что, поскольку это ошибка компиляции в деталях реализации access_control, вполне возможно, что это связано с разными флагами / конфигом компилятора, приводящими к компиляции другого кода. Это будет проблемой, даже если все включает из той же версии Boost.

В частности, некоторая часть кода может делать (различные) предположения относительно целевой платформы.

...