迁移工作模块时,提升“is_virtual_base_of”编译错误

时间:2011-10-04 22:50:39

标签: c++ serialization boost

我一直在使用boost序列化,我开发了一个整个模块来存储持久存储中的类,但是当我尝试将模块迁移到其他项目时,我遇到了一些我从未见过的错误,我没有发现任何相关的网上的信息。

我得到的错误是:

In file included from support.../boost_1_44/boost/serialization/void_cast.hpp:29,
                 from support.../boost_1_44/boost/archive/detail/oserializer.hpp:57,
                 from support.../boost_1_44/boost/archive/detail/interface_oarchive.hpp:23,
                 from support.../boost_1_44/boost/archive/detail/common_oarchive.hpp:22,
                 from support.../boost_1_44/boost/archive/basic_binary_oarchive.hpp:34,
                 from support.../boost_1_44/boost/archive/binary_oarchive_impl.hpp:23,
                 from support.../boost_1_44/boost/archive/binary_oarchive.hpp:21,
                 from .../ps_proxy.h:54,

support.../boost_1_44/boost/type_traits/is_virtual_base_of.hpp:57:10: error: macro "X" requires 2 arguments, but only 1 given
support.../boost_1_44/boost/type_traits/is_virtual_base_of.hpp:58:18: error: macro "X" requires 2 arguments, but only 1 given
support.../boost_1_44/boost/type_traits/is_virtual_base_of.hpp:60:11: error: macro "X" requires 2 arguments, but only 1 given
support.../boost_1_44/boost/type_traits/is_virtual_base_of.hpp:57: error: declaration does not declare anything
support.../boost_1_44/boost/type_traits/is_virtual_base_of.hpp:58: error: declaration does not declare anything
support.../boost_1_44/boost/type_traits/is_virtual_base_of.hpp:60: error: declaration of '~boost::detail::is_virtual_base_of_impl<Base, Derived, mpl_::bool_<true> >::X' as non-function
support.../boost_1_44/boost/type_traits/is_virtual_base_of.hpp:60: error: expected ';' before 'throw'

我希望有人可以给我一些关于为什么会发生这种情况的提示以及为什么它在一个模块上正常工作,当我迁移它时(应该是透明的迁移)它会抛出这些错误。

谢谢!

1 个答案:

答案 0 :(得分:2)

  1. boost::is_virtual_base_of<>用于Boost.Serialization的实现。
  2. 在Boost 1.44中,boost::is_virtual_base_of<>使用了名为XY的类型作为实施细节。
  3. 在您的其他项目的某个位置,有一个名为X的宏已定义,违反了X实施中使用的boost::is_virtual_base_of<>类型。
  4. 显然X是一个可怕的宏名称 - 如果它是你的,那么找到一个更好的名字,如果不是,那么通过电子邮件发送任何图书馆的作者定义它并投诉(然后#undef之前包括任何Boost标题)。

    FWIW,这显然是一个常见的问题,在Boost 1.47类型中使用了名为boost_type_traits_internal_struct_Xboost_type_traits_internal_struct_Y而不是XY,所以升级到更多当前版本的Boost是解决症状的另一种方法。