C++ Boost-iostream:包含 filtering_streambuf.hpp 时出现神秘错误

C++ Boost-iostream: mysterious error when including filtering_streambuf.hpp

我一直在使用 boost iostream 库(1.65 版),主要使用以下 header:<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 headers 之后,我得到了这个神秘的编译错误:

/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 中的错误?

我实际上 down-graded 我提高到 1.58,但我仍然看到同样的错误。

是的,这看起来像是版本冲突。

请注意,由于它是 access_control 实现细节上的编译错误,很可能是由于不同的编译器 flags/config 导致编译的代码不同。 这将是一个问题,即使所有包含都来自同一个 Boost 版本。

特别是,代码的某些部分可能会对目标平台做出(不同的)假设。

我发现这是定义的问题。 Microsoft 代码定义了一个宏调用 U(x),而 Boost 代码使用 U 作为模板变量。在导入微软代码头前加上#define _TURN_OFF_PLATFORM_STRING后,问题解决。