c ++:提升1.48类型特征和Cocoa包含怪异

时间:2011-11-17 20:11:56

标签: c++ cocoa boost

我刚刚在OSX Lion上开发的项目上更新了升级版本1.48.0,该项目还包括Cocoa标头。在这样做之后,我得到了一大堆错误,所有错误都指向has_prefix_operator.hpp和has_binary_operator.hpp,它们都指向了类似的行:

   BOOST_STATIC_CONSTANT(bool, value = (sizeof(check(((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));
  

../../ boost_1_48_0 /升压/ type_traits /细节/ has_binary_operator.hpp:157:4:   错误:预期表达式[1]

在尝试之后,由于我无法真正理解这些错误,我注意到如果我从以下位置切换包含顺序:

#import <Cocoa/Cocoa.h>
#include <boost/type_traits.hpp>

#include <boost/type_traits.hpp>
#import <Cocoa/Cocoa.h>
事情神奇地起作用。我对此非常困惑,因为它与之前的提升版本一起工作得很好,我不知道为什么会发生这种情况。关于可能发生的事情的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:16)

我基本上有同样的问题,并且从ildjam的线索,我找到了原因和解决方法。

(可怕的)宏名称是检查,在AssertMacros.h中定义。根据该文件中的评论,将来Apple将删除旧名称。目前,Apple已经添加了一个解决旧名称的解决方法,即在处理AssertMacros.h之前将__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES定义为0。 e.g。

#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
#import <Cocoa/Cocoa.h>

如果您使用前缀文件,那么您可以将定义放在那里。或者,直接解决方法是在包括type_traits.hpp之前进行undef检查。

#ifdef check
#undef check
#endif
#include "boost/type_traits.hpp"

(提交给Boost Trac的详细信息:https://svn.boost.org/trac/boost/ticket/6219

答案 1 :(得分:3)

重新发表评论,因为这显然是答案......

似乎Cocoa.h直接或间接定义了一个宏,其名称与Boost代码中使用的标识符之一相同。也就是说,Cocoa.h正在定义名为LhsRhshas_operator的宏或其他一些同样可怕的宏名称,并且它与Boost代码中使用的正确标识符相冲突

如果您想在将来的Boost版本中修复此问题,请缩小有问题的宏名称并提交Boost Trac的错误报告。